NSString:删除前导0,所以'00001234'变成'1234'?

可能重复:
从string中删除前导零

我需要删除NSString中的前导0,我能想到的一个快速方法是将string转换为NSNumber然后转换回NSString ,这将给我干净的string,虽然我不知道它是否工作。 有没有其他方法可以做到这一点?

谢谢

所以只是为了好玩,我决定用这种方法来做这个事情。 这绝不是一个科学testing,主要是为了我的娱乐,但是你们中的一些人可能喜欢看到它。

我创build了一个方法,并用各种例程代替了处理string,表示0到100,000的数字,都是三个前导0。

但请记住,即使最慢的方法是完全可以接受的,如果你只有一个(或甚至一百)这些string修剪。 (使用数字格式化器需要大约0.000012039905秒,或大约1/100毫秒。)其他的东西,比如你的代码是多么容易阅读和理解,通常更重要,除非你确实需要处理一个大文件这样的string。 我个人最喜欢的东西仍然是正则expression式,因为即使没有文档,它也是相对快速和直接显而易见的。

这里是结果(从最快到最慢):

通过string循环

 // I tried this by looping through the utf8String and got the same times // (actually, ever so slightly longer, probably since it had to create the c string) // // I did find that using `[string getCharacters:buffer range:range]` and // iterating over the character buffer that it took another 0.01 seconds // off the time. Hardly worth it though. :) NSUInteger length = [string length]; for (NSUInteger i = 0; i < length; i++) { if ([string characterAtIndex:i] != '0') { return [string substringFromIndex:i]; } } return @"0"; // Time 1: 0.210126 // Time 2: 0.219159 // Time 3: 0.201496 

转换为一个int,然后返回到一个NSString

 int num = [string intValue]; return [NSString stringWithFormat:@"%d", num]; // Time 1: 0.322206 // Time 2: 0.345259 // Time 3: 0.324954 long long num = [string longLongValue]; return [NSString stringWithFormat:@"%lld", num]; // Time 1: 0.364318 // Time 2: 0.344946 // Time 3: 0.364761 // These are only slightly slower, but you can do bigger numbers using long long 

使用NSScanner

 NSScanner *scanner = [NSScanner scannerWithString:string]; NSCharacterSet *zeros = [NSCharacterSet characterSetWithCharactersInString:@"0"]; [scanner scanCharactersFromSet:zeros intoString:NULL]; return [string substringFromIndex:[scanner scanLocation]]; // Time 1: 0.505277 // Time 2: 0.481884 // Time 3: 0.487209 

使用正则expression式

 NSRange range = [string rangeOfString:@"^0*" options:NSRegularExpressionSearch]; return [string stringByReplacingCharactersInRange:range withString:@""]; // Time 1: 0.610879 // Time 2: 0.645335 // Time 3: 0.637690 

使用静态数字格式化程序

 static NSNumberFormatter *formatter = nil; if (formatter == nil) { formatter = [NSNumberFormatter new]; formatter.numberStyle = NSNumberFormatterDecimalStyle; } NSNumber *number = [formatter numberFromString:string]; return [formatter stringFromNumber:number]; // Time 1: 1.774198 // Time 2: 1.753013 // Time 3: 1.753893 

使用数字格式化程序

 NSNumberFormatter *formatter = [NSNumberFormatter new]; formatter.numberStyle = NSNumberFormatterDecimalStyle; NSNumber *number = [formatter numberFromString:string]; return [formatter stringFromNumber:number]; // Time 1: 11.978336 // Time 2: 12.039905 // Time 3: 11.904984 // No wonder Apple recommends reusing number formatters! 

你可以使用正则expression式。

 NSString *numStr = @"0001234"; NSRange range = [numStr rangeOfString:@"^0*" options:NSRegularExpressionSearch]; NSString *result = [numStr stringByReplacingCharactersInRange:range withString:@""]; 

如果你做了很多(千次),你可能会受益于使用编译的NSRegularExpression

这工作,我testing了它。 我认为这是一个很好的方法。 减less代码less的bug。 KISS 。

 NSString *numStr = @"000123"; int num = numStr.intValue; numStr = [NSString stringWithFormat:@"%d", num];