我需要删除NSString
中的前导0,我能想到的一种快速方法是将字符串转换为NSNumber
,然后转换回NSString
,这将给我一个干净的字符串,虽然我不确定它是否有效。还有其他办法吗?
由于
答案 0 :(得分:11)
所以只是为了好玩,我决定用各种方式来做这件事。这绝不是一次科学测试,主要是为了娱乐,但你们中的一些人可能还是希望看到它。
我创建了一个方法并用各种例程代替处理代表数字0到100,000的字符串,所有字符串都带有三个前导0。
但请记住,即使最慢的方法也是完全可以接受的,如果你只有一个(甚至一百个)这些字符串要修剪。 (使用数字格式化器需要大约.000012039905秒,或大约1/100毫秒。)除非您确实需要处理大型文件,否则其他内容(例如代码的读取和理解程度)通常更为重要。像这样的字符串。我个人最喜欢的仍然是正则表达式,因为即使没有文档,它也是相对快速且立即显而易见的你想要完成的。
以下是结果(从最快到最慢):
循环播放字符串
// 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
使用正则表达式
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!
答案 1 :(得分:5)
您可以使用正则表达式。
NSString *numStr = @"0001234";
NSRange range = [numStr rangeOfString:@"^0*" options:NSRegularExpressionSearch];
NSString *result = [numStr stringByReplacingCharactersInRange:range withString:@""];
如果你做了很多事情(数千次),你可能会因使用编译的NSRegularExpression
而受益。
答案 2 :(得分:2)
这是有效的,我已经测试过了。我认为这是一个非常好的方式。减少代码减少bug。 KISS
NSString *numStr = @"000123";
int num = numStr.intValue;
numStr = [NSString stringWithFormat:@"%d", num];