0

温度を表示するラベルを作成しようとしています。温度が 100 を超える場合は最大 3 桁ですが、小数点以下は必要ありません...

    NSString *longtempstring = [tmp description];
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setMaximumFractionDigits:3];
    [formatter setMinimumFractionDigits:0];
    NSString *shorttempstring = [formatter stringForObjectValue:[NSString  stringWithString:longtempstring]];

上記のコードは常に (null) を返します

何か案は?

4

3 に答える 3

1

nil渡そうとするオブジェクトがstringForObjectValue:期待されるタイプではないため、取得しています。

まず、使わないstringForObjectValue:。それは、親クラスのメンバーですNSFormatter。には、 や などNSNumberFormatterのオブジェクト タイプの混乱を避ける、より具体的なメソッドがあります。numberFromString:stringFromNumber:

2 つ目NSNumberFormatterは、数値から書式設定された文字列、または書式設定された文字列から数値に変換するために使用されます。フォーマットされた文字列からフォーマットされた文字列に直接ではありません。1 つの数値フォーマッタを使用して元の文字列を読み取って数値を生成し、別の数値フォーマッタを使用してその数値から新しい短い書式設定された文字列を生成する必要があります。

もちろん、最初のステップ (長い文字列から数値へ) を使用するNSScannerか、長い文字列の部分文字列を取得して (数値自体を除くすべてを切り取って)、NSStringメソッドintegerValueまたはを使用することで、最初のステップ (長い文字列から数値へ) をより簡単にすることができる場合がありますdoubleValue。正規表現を使用して、最初の (長い) 文字列から数値を抽出することもできます。

要するに、これは 2 段階のプロセスです。最初のステップ (数値を取得する) は、さまざまな方法で実行できますNSNumberFormatterが、最も簡単な方法ではない可能性があります。2番目のステップ(新しい短い弦を手に入れる)NSNumberFormatterは完璧です.

于 2013-02-07T22:55:33.593 に答える
0
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:...]引数として指定した文字列のコピーである新しい文字列を作成します。文字列は不変であり、コピーする必要はなく、変更されません。NSStringaが実際にである可能性があることを恐れている場合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]);
于 2013-02-07T23:02:44.293 に答える
0

NSString を NSNumber に変換し、文字列から整数値のみを取得して、小数を削除することで修正しました。

        NSString *longtempstring = [tmp description];
        NSNumber *tempintegervalue = [NSNumber numberWithInteger:[longtempstring integerValue]];
        NSString *shorttempstring = [tempintegervalue stringValue];
于 2013-02-07T23:00:02.343 に答える