1

ドキュメントを読むと、次のような醜いことをしなければなりません。

NSLocale *usLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease];
NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:@"0.00001" locale:usLocale];

しかし: NSDecimalNumber クラスにピリオド (.) を探すように指示するより良い方法はありませんか? ロケールは私にとってとても危険に感じます。ある日、新しい大統領がピリオドのシンボルを から に変更するのはとてもクールだと考えたらどうなるでしょうか ? その後、アプリがクラッシュします。確かに、これはそれほど起こりそうにありません。しかし、それができる可能性はわずかです。これにロケールを使用するのは私を怖がらせるのに十分です;-)

何か案が?それともそれが私の唯一の選択肢ですか?それが唯一の選択肢である場合:上記のアプローチは正しいですか?それとももっと良いものがありますか?

そして: 正しく理解できれば、NSDecimalNumber オブジェクトはその文字列を読み取り、解析して、内部使用のために仮数、指数、および isNegative 値を作成しますよね?

編集:これらの値をプログラムで/手動で(私のコードで)追加することに言及する必要がありましたが、それらはユーザー入力ではありません。

4

3 に答える 3

2

ロケールを指定する必要があるのは、既定のロケールで有効な 10 進数ではない文字列を渡す場合のみです。ユーザーが文字列を作成している場合、使用しているロケールに合わせて文字列を適切にフォーマットする可能性が高くなります。

ロケールを使用することは、使用しないよりもはるかに安全です。「。」を解析しようとしています。「1,50」のうち、成功する可能性は低いです。

そしてそれを考えると

[NSDecimalNumber decimalNumberWithString:@"0.00001" locale:usLocale]

ドキュメントで次のように説明されています

指定された数値文字列の値と等しい値を持つ NSDecimalNumber オブジェクトを作成して返します。

値が文字列の値と等しい NSDecimalNumber を作成して返すことは安全な賭けだと思います。

于 2009-08-26T16:47:17.030 に答える
1

ロケールは良いことです。大統領が小数点をからに変更した場合.,ロケールen_USはOSの次のリリースで更新されます。上記のコードではロケールの小数点について明示的に言及していないので、問題ありません。そうは言っても、en_US明示的に指定するのではなく、システムロケールを取得することをお勧めします。これは、米国以外では間違っています。

文字列が気になる場合は、ユーザーからの文字列である必要があります。その場合、ユーザーはロケール固有の小数点を使用します。これは一致している必要があります。この方法で初期化しようとしている場合はNSDecimalNumber可能だと思いますが、その猫の皮を剥ぐもっと簡単な方法があると思います。

はい、正しく理解すれば、結果はNSDecimalNumberオブジェクトになります。このオブジェクトの値は、渡した文字列と同じです。

于 2009-08-26T16:33:44.403 に答える
0

ロケールは良いことです。静的内部データに適用される変更可能なロケールは悪いことであり、(ユーザーではなく)提供するデータにロケールを適用することを心配するのは正しいことです(おそらくパラノイド:D)。内部データにロケールを適用することに依存しないいくつかのソリューションを次に示します。

number = [NSDecimalNumber decimalNumberWithMantissa:1 exponent:-5 isNegative:NO];
number = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:0.00001] decimalValue];

2つ目は、を実装するNSDecimalNumberカテゴリに変換するのは非常に簡単-decimalNumberWithDouble:です。おそらくかなり便利です。

于 2009-08-26T16:49:43.123 に答える