0

私のアプリは金銭的価値を使用しており、ユーザーがiPhoneに設定した通貨と形式でこれらの値を表現したいのですが、テストすると、ドイツのEURO形式に問題があるようです。

通貨形式の文字列から(コアデータに格納するための)10進数を返すメソッドがあります。文字列は、実際にはNSlocaleを使用した別の(同様の)メソッドによってフォーマットされました。

私は英国、米国、日本、ドイツのロケールでテストしましたが、これまでのところ問題を引き起こしているのはドイツだけです。

コードは次のとおりです。渡される文字列は次のとおりです。2,56€</p>

+ (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'変数は次のように出力されます:-18446912453607470532000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

一方、他のすべてのロケールでは、NSDecimalNumberとしてCoreDataに保存するために2.56を出力します。

4

3 に答える 3

2

プロパティの設定:

[fmtrCurrencyFromStr setLenient:YES];

フランス、ドイツ、ノルウェー、英国、米国、日本、ナミビアなどの問題を修正します。すべてをテストしたわけではないため、すべてを修正したとは言えませんが、これまでにテストしたすべての問題を修正します。 、動作しました。

于 2010-11-30T22:49:55.630 に答える
0

私はあなたの問題はラインにあると思います

NSDecimalNumber* currencyNumber = [[NSDecimalNumber alloc] initWithDecimal:[[fmtrCurrencyFromStr numberFromString:strNumber] decimalValue]];

ほぼ同等の行に置き換えてみてください

NSDecimalNumber * currencyNumber = [fmtrCurrencyFromStr numberFromString:strNumber];

を設定generatesDecimalNumbersしたので、1つの厄介なケースを除いて2つはほとんど同等です:nil。

nilにメッセージを送信しても、ほとんどの標準タイプ(整数(古い32ビットランタイムの64ビット整数を除く)、浮動小数点、ポインタータイプ)では何も行われず、0が返されることが保証されています。メソッドが構造体を返す場合は、初期化されていないメモリを「返します」。NSDecimalは構造体です。

(根本的な理由は、基本的に、ランタイムが構造体の大きさを知らないため、ゼロにするメモリの量がわからないため、代わりに「初期化されていない」メモリを取得v.frameすることです。 vはnilではありません。)

編集:もちろん、他の問題は、NSNumberFormatterが価格を正しく解析しない理由です。それは難しいことです。通貨記号を削除してみます。

于 2010-11-21T05:16:47.127 に答える
0

iOS 4.3で、[formatter setLenient:YES]フラグを使用しても、ユーロを使用しても機能することを確認しました。そのフラグが設定されていないと、フォーマッタはユーロの正しい値を返しません。

于 2011-10-28T08:08:10.697 に答える