私のアプリは金額を使用しています。私はこれらの値を通貨で表現したいと思いますが、ユーザーがiPhoneで設定したフォーマットでは、私はドイツのEUROフォーマットに問題があるようです。NSLecaleを使用してNSDecimalNumberでユーロフォーマットのiPhone通貨のバグ?
通貨フォーマットされた文字列から(コアデータに格納するための)10進数を返すメソッドがあります。文字列は実際にはNSlocaleを使って別の(類似の)メソッドでフォーマットされていました。
英国、米国、日本、ドイツのロケールでテストしましたが、これまでのところドイツだけが問題を引き起こしています。
ここコードだ、渡された文字列は、例えばある:2,56€
+ (NSDecimalNumber*)TLCurrencyFormatFromString:(NSString*)strNumber {
NSNumberFormatter *fmtrCurrencyFromStr = nil;
fmtrCurrencyFromStr = [[NSNumberFormatter alloc] init];
[fmtrCurrencyFromStr setFormatterBehavior:NSNumberFormatterBehavior10_4];
[fmtrCurrencyFromStr setLocale:[NSLocale currentLocale]];
[fmtrCurrencyFromStr setNumberStyle:NSNumberFormatterCurrencyStyle];
[fmtrCurrencyFromStr setGeneratesDecimalNumbers:YES];
NSLog(@"Currency Separator: %@", [fmtrCurrencyFromStr decimalSeparator]); //prints a comma
NSLog(@"Currency Code: %@", [fmtrCurrencyFromStr currencyCode]); //prints EUR
int currencyScale = [fmtrCurrencyFromStr maximumFractionDigits];
NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:currencyScale raiseOnExactness:FALSE raiseOnOverflow:TRUE raiseOnUnderflow:TRUE raiseOnDivideByZero:TRUE];
NSDecimalNumber* currencyNumber = [[NSDecimalNumber alloc] initWithDecimal:[[fmtrCurrencyFromStr numberFromString:strNumber] decimalValue]];
NSLog(@"Currency Number = %@", [currencyNumber decimalNumberByRoundingAccordingToBehavior:roundingBehavior]);
return [currencyNumber decimalNumberByRoundingAccordingToBehavior:roundingBehavior];
}
'currencyNumber' 変数は、以下のように印刷されます:すべてで-18446912453607470532000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
に対し他のロケールでは、Core DataにNSDecimalNumberとして格納するために2.56を出力します。