4

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

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

谢谢

4

3 回答 3

11

所以只是为了好玩,我决定用各种方法来计时。这绝不是一项科学测试,主要是为了我的消遣,但你们中的一些人可能还是想看看。

我创建了一个方法并替换了各种例程来处理表示数字 0 - 100,000 的字符串,所有这些字符串都带有三个前导 0。

但是请记住,如果您只有一个(甚至一百个)这些字符串需要修剪,那么即使是最慢的方法也完全可以接受。(使用数字格式化程序大约需要 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!
于 2012-11-13T04:43:56.593 回答
5

你可以使用正则表达式。

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

如果您经常这样做(如数千次),您可能会从使用已编译的NSRegularExpression.

于 2012-11-13T03:27:31.987 回答
2

这行得通,我已经测试过了。而且我认为这是一个非常好的方法。更少的代码更少的错误。亲吻

NSString *numStr = @"000123";
int num = numStr.intValue;
numStr = [NSString stringWithFormat:@"%d", num];
于 2012-11-13T03:18:29.593 回答