4

重複の可能性:
文字列から先頭のゼロを削除する

の先頭の 0 を削除する必要がありNSStringます。考えられる簡単な方法は、文字列を にNSNumber変換してから元に戻すことNSStringです。これを行う他の方法はありますか?

ありがとう

4

3 に答える 3

11

ですから、楽しみのために、これを行うさまざまな方法の時間を計ることにしました。これは決して科学的なテストではなく、主に私の娯楽のために行われたものですが、とにかく見たいと思う人もいるかもしれません.

メソッドを作成し、0 から 100,000 までの数字を表す文字列を処理するためのさまざまなルーチンを置き換えました。すべて先頭に 3 つの 0 があります。

ただし、トリミングする文字列が 1 つ (または 100 個) しかない場合は、最も遅い方法でも完全に受け入れられることに注意してください。(数値フォーマッタを使用すると、約 .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 に答える