重複の可能性:
文字列から先頭のゼロを削除する
の先頭の 0 を削除する必要がありNSString
ます。考えられる簡単な方法は、文字列を にNSNumber
変換してから元に戻すことNSString
です。これを行う他の方法はありますか?
ありがとう
重複の可能性:
文字列から先頭のゼロを削除する
の先頭の 0 を削除する必要がありNSString
ます。考えられる簡単な方法は、文字列を にNSNumber
変換してから元に戻すことNSString
です。これを行う他の方法はありますか?
ありがとう
ですから、楽しみのために、これを行うさまざまな方法の時間を計ることにしました。これは決して科学的なテストではなく、主に私の娯楽のために行われたものですが、とにかく見たいと思う人もいるかもしれません.
メソッドを作成し、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!
正規表現を使用できます。
NSString *numStr = @"0001234";
NSRange range = [numStr rangeOfString:@"^0*" options:NSRegularExpressionSearch];
NSString *result = [numStr stringByReplacingCharactersInRange:range withString:@""];
何度も (何千回も) 実行する場合は、コンパイル済みのNSRegularExpression
.
これは機能します、私はそれをテストしました。そして、これはとても良い方法だと思います。コードが少なく、バグが少ない。キス。
NSString *numStr = @"000123";
int num = numStr.intValue;
numStr = [NSString stringWithFormat:@"%d", num];