2010-11-21 39 views
0

我的应用程序使用货币值,我想用货币和格式来表示这些值,但用户在iPhone上设置时,在测试时,我似乎遇到了德国欧元格式的麻烦。使用NSLocale的NSDecimalNumber欧元格式的iPhone货币的错误?

我有一个方法从货币格式化字符串返回一个十进制数(用于存储在核心数据中)。该字符串实际上是由使用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

而在所有其他地区,它将打印2.56作为NSDecimalNumber存储到Core Data中。

回答

2

设置属性:

[fmtrCurrencyFromStr setLenient:YES]; 

修正了法国,德国,挪威,英国,美国,日本,纳米比亚等问题......我不能说这修复它为所有因为我的天堂”对所有的测试都进行了测试,但是迄今为止我测试过的所有测试都已经完成。

0

认为你的问题是与线

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

尝试与大多等效线

NSDecimalNumber * currencyNumber = [fmtrCurrencyFromStr numberFromString:strNumber]; 

你已经设置generatesDecimalNumbers替换它,所以这两个是几乎等同除了一个令人讨厌的情况:无。发送消息给nil保证不会做任何事情,并且对于大多数标准类型(整数(在旧的32位运行时中不是64位整数除外),浮点数,指针类型)返回0。如果方法返回一个结构,它将“返回”未初始化的内存。 NSDecimal是一个结构体。 (其原因基本上是运行时不知道结构有多大,所以不知道有多少内存归零,因此你会得到“未初始化”的内存。做v.frame不保证v不为零)

编辑:当然,你其他问题是为什么NSNumberFormatter没有被正确解析的价格。这是一个艰难的。我会尝试剥离货币符号。

0

我验证了在iOS 4.3上使用[formatter setLenient:YES]标志为我工作以及使用欧元。没有设置该标志,格式化程序不会为欧元返回正确的值。