NSString *longtempstring = [tmp description];
longtempstring
ここの価値は何ですか?数字でもありますか?
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setMaximumFractionDigits:3];
[formatter setMinimumFractionDigits:0];
小数桁が不要だと言うのに、なぜ最大小数桁をに設定する3
のですか?小数桁は「ドットの後」であり、小数は必要ないと言います。小数が不要な場合は、最小値と最大値をに設定する必要があります0
。
NSString *shorttempstring = [formatter stringForObjectValue:[NSString stringWithString:longtempstring]];
まず、なぜ文字列をコピーするのですか?[NSString stringWithString:...]
引数として指定した文字列のコピーである新しい文字列を作成します。文字列は不変であり、コピーする必要はなく、変更されません。NSString
aが実際にである可能性があることを恐れている場合NSMutableString
、結局のところ、それはのサブクラスでNSString
あり、それをコピーしたい場合は、を呼び出してコピーする[aString copy]
だけです。copy
ここでは非常に賢い方法です。が実際に可変文字列である場合NSString
、それは実際にそれをコピーするので、不変のコピーを取得します。ただし、変更可能な文字列でない場合はcopy
、保持カウントを1増やした同じ文字列を返すだけです(その場合、 )とcopy
まったく同じように動作しretain
ます。ただし、あなたの場合、コピーはまったく意味がありません。
そして第二に、あなたが文字列を?にフィードできるとあなたが信じる理由は何NSNumberFormater
ですか?NSNumberFormater
タイプのオブジェクトをフォーマットするために呼び出されますNSNumber
。どうNSString
ですかNSNumber
?とは呼ばれませんNSStringFormater
。間違ったクラスのオブジェクトをフォーマッタにフィードすると、それが返さnil
れます。これが、このメソッドが文書化されている方法です。
longtempstring
たとえば、に分数のある数値が含まれている場合12.345
、正しいコードは次のようになります。
NSString * longtempstring = [tmp description];
NSNumberFormatter * formatter = [[NSNumberFormatter alloc] init];
[formatter setMaximumFractionDigits:0];
[formatter setMinimumFractionDigits:0];
NSNumber * tempnumber = [NSNumber numberWithDouble:[longtempstring doubleValue]];
NSString * shorttempstring = [formatter stringForObjectValue:tempnumber];
ただし、小数点以下を切り捨てるだけの場合は、それは恐ろしい方法です。これははるかに効果的に行うことができます:
double d;
NSString * longtempstring;
NSString * shorttempstring;
longtempstring = @"12.345";
d = [longtempstring doubleValue];
shorttempstring = [NSString stringWithFormat:@"%d", (int)d];
これははるかに短く、必要なメモリが少なく、少なくとも3倍高速です。数値を四捨五入する場合(つまり、端数以上の値はすべて.5
次に高い値に四捨五入されます)、次のように四捨五入します。
d = round([longtempstring doubleValue]);