【问题标题】:Removing leading zeroes from a string从字符串中删除前导零
【发布时间】:2011-04-09 03:22:36
【问题描述】:

我有一个字符串0023525631,但我想要的是字符串23525631——没有前导零。我该怎么做?

【问题讨论】:

标签: objective-c string cocoa nsstring


【解决方案1】:

像这样使用正则表达式,

 NSString *str =@"000034234247236000049327428900000";
    NSRange range = [str rangeOfString:@"^0*" options:NSRegularExpressionSearch];
    str= [str stringByReplacingCharactersInRange:range withString:@""];
    NSLog(@"str %@",str);

O/P:-str 34234247236000049327428900000

【讨论】:

  • 我更喜欢这个解决方案,因为它不假设原始字符串可以安全地转换为整数。
  • 我目前正在处理大于 1000 位的大量数字,这个答案非常适合此类实现。
  • 这也将删除 0.9 中的零!
【解决方案2】:

如果你是数字,你可以将字符串转换为整数和整数到字符串。

或者

声明指向此字符串的指针并将此指针设置为字符串的开头,然后迭代您的字符串并在此指针中添加字符串开头的零个数。然后你有一个指向在零之前开始的字符串的指针,你必须使用指针来获取不带零的字符串,如果你使用字符串,你可以获得带零的字符串。

或者

你可以反转字符串,并从反向迭代它,如果你得到一些char != '0'你停止迭代,否则你把这个字符重写为空。在它之后,您可以反转字符串以在字符串中取回您的整数而不带前导零。

【讨论】:

  • 为什么需要反转字符串,我认为前向迭代会更好?您可以迭代,如果遇到 0,则删除,而不是 0,停止?
  • @vodkhang:不,因为您不能在字符串的开头设置 null。并且反向时,字符串的长度发生了变化(在第二次反向中),因为第二次反向得到更小的迭代(取决于写入了多少空值)
  • @vodkhand:你不必反转你的字符串,但你必须使用其他移动的指针指向你的字符串(向右移动取决于零的数量)
  • @vodkhand:我为你添加了其他解决方案
  • 将 String(00123456525) 转换为 int 确实为我解决了难题,非常感谢 ...
【解决方案3】:

这正是NSNumberFormatter 的用途(而且做得更好)。为什么要重新发明轮子?

【讨论】:

  • 信不信由你,这是所有建议方法中最慢的。并不是说一次折扣(甚至可能是 1000 次折扣)很重要,但是如果您需要一种有效的方法来做到这一点,那么这不是要走的路。
  • 在瞬间绘制数百个标签以实现全视图渲染到 PDF...
  • 当然,我什至在我的评论中这么说。 :-)
  • 是的,如果您想了解此方法与其他方法之间的区别,请查看我在此处发布的链接(关于原始问题)到我在 SO 的另一个问题上的答案。跨度>
【解决方案4】:

你可以用这个:

NSString *testStr = @"001234056";
testStr = [NSString stringWithFormat:@"%d",[testStr intValue];

【讨论】:

  • 这不能按预期工作。大数字溢出
【解决方案5】:

我在这里假设您只想删除前导零。 IE。 @"*00*1234*0*56" 变为 @"1234*0*56",而不是 @"123457"。为此,我会使用 NSScanner。

// String to strip
NSString *test = @"001234056";

// 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);

【讨论】:

  • 这个解决方案效率不高。 NSScanner 非常昂贵。 NSNumberFormatter 在这方面表现出色。
  • 实际上,在这种情况下,NSScanner 比 NSNumberFormatter 快很多
【解决方案6】:

没有正则表达式

func trimLeadingZeroes(input: String) -> String {
    var result = ""
    for character in input.characters {
        if result.isEmpty && character == "0" { continue }
        result.append(character)
    }
    return result
}

使用正则表达式

func trimLeadingZeroes(input: String) -> String {
    return input.stringByReplacingOccurrencesOfString(
        "^0+(?!$)",
        withString: "",
        options: .RegularExpressionSearch,
        range: Range(start: input.startIndex, end: input.endIndex)
    )
}

【讨论】:

    【解决方案7】:

    如有疑问,请迭代

    无需像其他答案那样复杂。

    这样简单的事情就足够了。

    while ([string hasPrefix:@"0"]) {
        string = [string substringFromIndex:1];
    }
    

    注意事项:

    •如果您的字符串编号类似于0.12,您将留下.12。如果不需要,则只需检查 hasPrefix:@"." 并与前置 @"0" 连接。

    •如果您的字符串编号只是0,您将一无所有。如果不需要,则只需检查 isEqualToString:@"" 并设置为 @"0"

    •如果速度对您来说真的很重要,您可以在达到非零值时遍历字符 (scan)break;(在 index n),那么你只需 substringFromIndex:n

    【讨论】:

      【解决方案8】:

      更好的方法是写一个可以随时使用的函数。

      -(NSString *)trimZero:(NSString*)inputString {
      
      NSScanner *scanner = [NSScanner scannerWithString:inputString];
      NSCharacterSet *zeros = [NSCharacterSet
                               characterSetWithCharactersInString:@"0"];
      [scanner scanCharactersFromSet:zeros intoString:NULL];
      
      return [inputString substringFromIndex:[scanner scanLocation]];
      }
      

      用法:

      NSString *newString = [self trimZero:yourString];
      

      【讨论】:

        【解决方案9】:

        这是一个基于 C 字符串的实现。

        char *cstr = [string UTF8String];
        while (*cstr == '0')
            ++cstr;
        return [NSString stringWithUTF8String:cstr];
        

        当然,这也不会跳过前导空格,而 NSScanner(默认情况下)会。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-09
          • 1970-01-01
          • 2019-10-20
          • 2015-12-25
          • 2014-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多