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

hzx*_*zxu 4 objective-c nsstring ios

可能重复:
从字符串中删除前导零

我需要删除前导0,NSString我能想到的一种快速方法是将字符串转换为NSNumber然后转换回来,NSString这将给我干净的字符串,虽然我不确定它是否有效.有没有其他方法可以做到这一点?

谢谢

lna*_*ger 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
Run Code Online (Sandbox Code Playgroud)

转换为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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

使用正则表达式

NSRange range = [string rangeOfString:@"^0*" options:NSRegularExpressionSearch];
return [string stringByReplacingCharactersInRange:range withString:@""];

// Time 1: 0.610879
// Time 2: 0.645335
// Time 3: 0.637690
Run Code Online (Sandbox Code Playgroud)

使用静态数字格式化程序

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
Run Code Online (Sandbox Code Playgroud)

使用数字格式化程序

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!
Run Code Online (Sandbox Code Playgroud)


dre*_*lax 5

您可以使用正则表达式.

NSString *numStr = @"0001234";
NSRange range = [numStr rangeOfString:@"^0*" options:NSRegularExpressionSearch];
NSString *result = [numStr stringByReplacingCharactersInRange:range withString:@""];
Run Code Online (Sandbox Code Playgroud)

如果你做了很多(如成千上万次),你可以从使用编译中受益NSRegularExpression.