2010-11-21 9 views
0

私のアプリは金額を使用しています。私はこれらの値を通貨で表現したいと思いますが、ユーザーが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を出力します。

答えて

2

[fmtrCurrencyFromStr setLenient:YES]; 

修正フランス、ドイツ、ノルウェー、英国、米国、日本、Nambiaなどのための問題...私はそれがすべてのために私の避難所「のためにそれを修正したと言うことはできません私はこれまでにテストしたすべてのもののうち、すべてをテストしました。

0

と思いあなたの問題は

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

あなたはgeneratesDecimalNumbersを設定している

NSDecimalNumber * currencyNumber = [fmtrCurrencyFromStr numberFromString:strNumber]; 

ほとんどが相当ラインとそれを交換してみてくださいラインであるので、2つはかなり同等です1つの厄介なケースを除いて:nil。

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

(根本的な理由は、基本的に実行時に構造体の大きさが分からないため、メモリをどれくらいゼロにするかわからないため、代わりに「初期化されていない」メモリが得られます。 vがnilでないことを確認せずにv.frameを行う)

EDITを:。もちろん、NSNumberFormatterが正しく価格を解析されていない理由をの問題があります。それは厳しいものです。私は通貨記号を剥奪しようとします。プロパティを設定

0

私は[formatter setLenient:YES]フラグを使ってiOS 4.3でEurosを使用していることを確認しました。このフラグを設定しないと、フォーマッタはユーロに対して正しい値を返しません。

関連する問題