NSString:删除前导0,使'00001234'变为'1234'?

时间:2012-11-13 02:49:56

标签: objective-c ios nsstring

  

可能重复:
  Removing leading zeroes from a string

我需要删除NSString中的前导0,我能想到的一种快速方法是将字符串转换为NSNumber,然后转换回NSString,这将给我一个干净的字符串,虽然我不确定它是否有效。还有其他办法吗?

由于

3 个答案:

答案 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];