从字符串中删除前导零

19

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


有关此操作的各种方法的比较(以及每种方法的示例代码),请参见此答案:https://dev59.com/QmrXa4cB1Zd3GeqPCsd9#13355703。 - lnafziger
9个回答

25

像这样使用正则表达式:

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

O/P:-字符串 34234247236000049327428900000


5
我更喜欢这个解决方案,因为它不假设原始字符串可以安全地转换为整数。 - René
1
我目前正在处理大于1000位数字的工作,对于这样的实现,这个答案可以很好地扩展。 - Bamsworld
1
这也会移除0.9中的零! - Abdurrahman Mubeen Ali

11

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

或者

声明指向该字符串的指针,并将该指针设置为字符串的开始位置,然后遍历该字符串并在该指针上添加零的数量以使其位于字符串开头。然后你会得到一个指向以零前面开始的字符串的指针,你必须使用该指针来获取没有零的字符串,如果使用字符串,你将获得带有零的字符串。

或者

你可以反转字符串,并从反转后的字符串开始迭代,如果你得到某个不等于“0”的字符,就停止迭代,否则将该字符重写为 null。之后,你可以反转字符串以获取没有前导零的整数字符串。


2
为什么需要反转字符串?我认为正向迭代会更好。你可以只需迭代,如果遇到0,则删除;如果不是0,则停止。 - vodkhang
@vodkhang:不行,因为你无法在字符串开头设置 null。而且使用反转后,字符串的长度会发生变化(在第二次反转中),因为第二次反转会得到更小的迭代次数(取决于写入了多少个 null)。 - Svisstack
@vodkhand:你不必反转字符串,但你必须使用其他指针来移动你的字符串(根据零的数量向右移动)。 - Svisstack
@vodkhand:我为您添加了其他解决方案。 - Svisstack
将字符串(00123456525)转换为整数确实对我有帮助,非常感谢... - mrugen munshi

8
您可以使用以下内容:
NSString *testStr = @"001234056";
testStr = [NSString stringWithFormat:@"%d",[testStr intValue];

1
这个程序无法按预期工作。对于大数值,它会溢出。 - Toad

8
这正是NSNumberFormatter所擅长的事情(而且它做得更好)。为什么要重新发明轮子呢?

信不信由你,这是所有建议方法中最慢的一种。虽然对于一次性的(甚至可能是1000次)并不重要,但如果您需要一种高效的方法来完成此操作,那么这不是正确的选择。 - lnafziger
当然,我在我的评论中甚至说了这个。 :-) - lnafziger
1
如果你想看看这种方法和其他方法之间的区别,可以查看我在SO上另一个问题的答案,链接已经发布在原问题中了。 - lnafziger
当然,希望你觉得这很有用。不过,就我而言,你的方法也是我首先想到的。 :) - lnafziger
@JAL,你想让我怎么做呢?复制并粘贴整个API参考文档中我提到的确切类名,并友好地提供链接帮助读者避免不必要的文档搜索?如果OP正在问“一些可以点击的可视控件会发生什么事情”该怎么办?提及和链接NSButton API参考文档或提及NSButton并粘贴其整个API参考文档?有一种将社区准则推到荒谬极端的做法…… - Joshua Nozzi
显示剩余2条评论

7

我在这里假设您只想删除前导零。即@"*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 在这个领域表现出色。 - jer
2
实际上,在这种情况下,NSScanner比NSNumberFormatter快得多。 - lnafziger

4

没有正则表达式

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)
    )
}

1

当你不确定时,迭代

不需要变得像其他答案那样复杂。

这么简单的方法就足够了。

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

注意:

•如果你的字符串数字类似于0.12,那么你将得到.12。如果不需要这样,只需检查是否hasPrefix:@"."并在前面加上@"0"。

•如果你的字符串数字仅为0,则什么都不会留下。如果不需要这样,只需检查是否isEqualToString:@""并设置为@"0"

•如果速度对你非常非常重要,你可以通过字符迭代(扫描)并在达到非零值(索引n)时break;,然后你会得到substringFromIndex:n


0
更好的方法是编写一个可随时使用的函数。
-(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];

0

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接