【问题标题】:NSString by removing the initial zeros?NSString 通过删除初始零?
【发布时间】:2012-05-18 20:11:00
【问题描述】:

如何从NSString 中删除前导零?

例如我有:

NSString *myString;

使用 @"0002060"@"00236"@"21456" 等值。

如果出现任何前导零,我想删除它们:

例如将前一个转换为@"2060"@"236"@"21456"

谢谢。

【问题讨论】:

    标签: objective-c cocoa-touch nsstring


    【解决方案1】:

    对于较小的数字:

    NSString *str = @"000123";      
    NSString *clean = [NSString stringWithFormat:@"%d", [str intValue]];
    

    对于超过 int32 范围的数字:

    NSString *str = @"100004378121454";     
    NSString *clean = [NSString stringWithFormat:@"%d", [str longLongValue]]; 
    

    【讨论】:

    • 嗨@adali,但是当字符串长度> 9时,它会给出一些不同的值。你能检查一下吗。例如NSString *str = @"3103282369"; NSString *clean = [NSString stringWithFormat:@"%d", [str intValue]]; NSLog(@"Clean- %@",clean);给出 2147483647 作为输出。
    • 哦,因为超出了int值的范围,你可以把它改成longLongValue,然后你必须把它格式化成%qi而不是%d
    • 如果数字太大,您可以使用下面的解决方案:)
    • int 的范围是 –2,147,483,648 到 2,147,483,647,long 的范围是 –9,223,372,036,854,775,808 到 9,223,372,036,854,775,807,看看够不够
    • 真的很有帮助..非常感谢@adali。
    【解决方案2】:

    这实际上是一个非常适合正则表达式的情况:

    NSString *str = @"00000123";
    
    NSString *cleaned = [str stringByReplacingOccurrencesOfString:@"^0+"              
                                                       withString:@"" 
                                                          options:NSRegularExpressionSearch 
                                                            range:NSMakeRange(0, str.length)];
    

    只有一行代码(从逻辑上讲,为了清楚起见,添加了换行符)并且它处理的字符数没有限制。

    正则表达式模式的简要说明:

    ^ 表示模式应该锚定到字符串的开头。我们需要它来确保它不匹配数字序列中的合法零。

    0+ 部分表示它应该匹配一个或多个零。

    放在一起,它匹配字符串开头的一个或多个零的序列,然后用一个空字符串替换它 - 即,它删除前导零。

    【讨论】:

      【解决方案3】:

      下面的方法也给出了输出。

      NSString *test = @"0005603235644056";
      
      // Skip leading zeros
      NSScanner *scanner = [NSScanner scannerWithString:test];
      NSCharacterSet *zeros = [NSCharacterSet
                               characterSetWithCharactersInString:@"0"];
      [scanner scanCharactersFromSet:zeros intoString:NULL];
      
      // Get the rest of the string and log it
      NSString *result = [test substringFromIndex:[scanner scanLocation]];
      NSLog(@"%@ reduced to %@", test, result);
      

      【讨论】:

        【解决方案4】:
         - (NSString *) removeLeadingZeros:(NSString *)Instring
         {
                NSString *str2 =Instring ;
        
                for (int index=0; index<[str2 length]; index++) 
                {
                   if([str2 hasPrefix:@"0"]) 
                       str2  =[str2 substringFromIndex:1];
                    else
                        break;
                }
                return str2;
        
         }
        

        【讨论】:

        • 您的原始代码只是在递归调用 removeLeadingZeros 之前缺少一个 return 语句。
        【解决方案5】:

        除了adali的回答,如果你担心字符串太长(即大于9个字符),你可以这样做:

        NSString *str = @"000200001111111";
        NSString *strippedStr = [NSString stringWithFormat:@"%lld", [temp longLongValue]];
        

        这会给你结果:200001111111

        否则,[NSString stringWithFormat:@"%d", [temp intValue]] 可能会因为溢出而返回 2147483647。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-02-24
          • 2011-07-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-10
          • 2018-07-26
          相关资源
          最近更新 更多