1

私は NSNumberFormatter と深刻な論争を抱えており、その広範なドキュメントを調べた後でも、遭遇した非常に単純な問題に頭を悩ませることができませんでした. 皆さんが私を助けてくれることを願っています。

私が持っているもの:NSDecimalNumberで表示される計算結果を表すUITextField
必要なもの: その結果の科学的表記。

私がやっていること:

-(void)setScientificNotationForTextField:(UITextField*)tf Text:(NSString*)text {

NSString* textBefore = text;

// use scientific notation, i.e. NSNumberFormatterScientificStyle
NSNumberFormatter* formatter = [[NSNumberFormatter alloc] init];
//[formatter setGeneratesDecimalNumbers:YES];
[formatter setNumberStyle:NSNumberFormatterScientificStyle];
NSDecimalNumber* number = (NSDecimalNumber*)[formatter numberFromString:text];
tf.text = [number descriptionWithLocale:[[Utilities sharedUtilities] USLocale]];

NSString* textAfter = tf.text;
// DEBUG
NSLog(@"setScientificNotation | text before = %@, text after = %@", textBefore, textAfter);

[formatter release];
}

何が起こるか:
特定の結果が 0.0099 になる場合があります。textBeforeその正しい値を保持します。フォーマッタに 10 進数を生成するように指示しないと (上記のスニペットでコメントアウトされています)、NSDecimalNumber から NSNumber が作成され、偽の結果が生成され、0.009900000000000001 になりますtextAfter。 NSDecimalNumber.
NumberFormatter に小数を生成するように指示しても、それでも間違った結果が作成されます。さらに、指数表記 (例: "1.23456e-10") を挿入する前に、完全な 10 進数を生成 (したがって表示) しますが、これは私が望むものではありません。
繰り返しますが、フォーマッタで NSDecimalNumber を使用するようにしたいので、'


クラスの使い方が間違っていますか?ドキュメントを誤解しましたか?なぜこれが起こるのか、どうすれば私が望む動作を作成できるのかを誰かが説明できますか? もちろん、何かを見つけたら、調査を続けて更新します。

4

1 に答える 1

4

NSNumberanを anにキャストして、NSDecimalNumberそれが機能することを期待することはできません。数値が複雑すぎない場合は、NSNumberFormatter代わりにこれを使用してみてください。

NSDecimalNumber* number = [NSDecimalNumber decimalNumberWithString:text];

これにより、実際のNSDecimalNumberインスタンスとその精度が得られます。

残念ながら、setGeneratesDecimalNumbers:正しく動作しません。これは既知のバグです。数値が複雑すぎて を操作できないdecimalNumberWithString:場合は、おそらく Apple の API がうまく機能していません。唯一のオプションは、文字列を手動で解析してNSDecimalNumber理解できるものにするか、によって提供された不正確な値に対して後処理を実行することですNSNumberFormatter

最後に、科学表記法の数値が本当に必要な場合は、先ほど使用した数値フォーマッターを使用してみませんか? stringFromNumber:フォーマットされた値を取得するために呼び出すだけです。

于 2012-07-29T20:00:28.200 に答える