10

ドキュメントによると[NSDecimalNumber decimalNumberWithString:]、ロケールの小数点記号を使用する必要があります。

NSDecimalSeparator がピリオド (米国などで使用されている) であるかコンマ (フランスなどで使用されている) であるかは、デフォルトのロケールによって異なります。

しかし、試してみると、このコード:

NSLog(@"%@", [NSDecimalNumber decimalNumberWithString:@"100,1"]);
NSLog(@"%@", [NSDecimalNumber decimalNumberWithString:@"100,1" locale:NSLocale.currentLocale]);

与える...

100
100.1

... iOS 5 と iOS 6 の両方の出力として。これらの国では小数点としてコンマ (,) が使用されているため、スウェーデン語とフランス語を地域設定として試しました。

出力は同じであるべきではありませんか?

( [NSDecimalNumber decimalNumberWithString:locale:] を使用して動作を強制できることはわかっているため、この質問は、これがバグであるか、何か間違っている場合にのみ、代替手段を見つけることではありません)

4

1 に答える 1

7

NSDecimalNumberは、数値型データの単なるストレージクラスです。渡した文字列に対してパーサー(NSNumberFormatter)を実行して、番号を作成します。2番目のログステートメントが「より適切に」機能する理由は、最初のステートメントがデフォルトの数値形式ロケール(en_USのように見えますが、これを確認できません。詳細については編集ブローを参照してください)を使用して解析し、 「100,1」は有効な数値ではないため、「非数値」の部分は削除されます。「、」小数点を使用するロケールを指定することにより、完全な数値を適切にキャプチャします。

NSLog()をNSDecimalNumberにすると-description、ロケールコンテキストがなく、多かれ少なかれ必要なものを出力できる、を呼び出すだけです。

適切にフォーマットされた数値を印刷する場合は、次のようにNSNumberFormatterを使用します。

NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:@"100.1"];

NSLog(@"%@", number);

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];

[formatter setNumberStyle:NSNumberFormatterDecimalStyle];

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"];

[formatter setLocale:locale];

NSLog(@"%@", [formatter stringFromNumber:number]);

または、簡単に

NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:@"100.1"];
NSLog(@"%@", [NSNumberFormatter localizedStringFromNumber:number numberStyle:NSNumberFormatterDecimalStyle]);

現在のロケールを使用したいだけの場合。

要約すれば:

  1. NSDecimalNumberは単なるストレージです。ログに記録しても、ロケールについては何も反映されません。
  2. NSDecimalNumberで数値を適切に格納するには、そのロケールが予想される入力のロケールと一致している必要があります(-[NSLocale currentLocale]ここでは適切な選択です)。
  3. 特定のロケールに対して正しくフォーマットされた数値を表示するには、NSNumberFormatterを使用します。

編集:

わかりました、私はこれについてもう少し研究をしました。

GNUStepでは、 (コードのクイックブラウジングから)NSDecimalSeparatorinの値を使用するように見えます。NSUserDefaults

いくつかの実験を行ったところ、私が知る限り、次のいずれもデフォルトの解析動作に影響を与えないことがわかりました。

  1. NSDecimalSeparatorNSUserDefaults
  2. AppleLocaleNSUserDefaults
  3. NSLocaleCodeNSUserDefaults
  4. に設定された値CFBundleDevelopmentRegion
  5. 環境の// LANGetc LC_ALL...値。
  6. +[NSLocale systemLocale]

そして、明らかにそうではありません+[NSLocale currentLocale]。この質問は、現在のロケールが効果を持たないという事実から生じているためです。

于 2013-03-20T21:47:04.350 に答える