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]);
現在のロケールを使用したいだけの場合。
要約すれば:
- NSDecimalNumberは単なるストレージです。ログに記録しても、ロケールについては何も反映されません。
- NSDecimalNumberで数値を適切に格納するには、そのロケールが予想される入力のロケールと一致している必要があります(
-[NSLocale currentLocale]
ここでは適切な選択です)。
- 特定のロケールに対して正しくフォーマットされた数値を表示するには、NSNumberFormatterを使用します。
編集:
わかりました、私はこれについてもう少し研究をしました。
GNUStepでは、 (コードのクイックブラウジングから)NSDecimalSeparator
inの値を使用するように見えます。NSUserDefaults
いくつかの実験を行ったところ、私が知る限り、次のいずれもデフォルトの解析動作に影響を与えないことがわかりました。
NSDecimalSeparator
でNSUserDefaults
。
AppleLocale
でNSUserDefaults
。
NSLocaleCode
でNSUserDefaults
。
- に設定された値
CFBundleDevelopmentRegion
。
- 環境の//
LANG
etc LC_ALL
...値。
+[NSLocale systemLocale]
。
そして、明らかにそうではありません+[NSLocale currentLocale]
。この質問は、現在のロケールが効果を持たないという事実から生じているためです。