使用NSLocale使用NSDecimalNumber的欧元格式的iPhone货币错误?

时间:2010-11-21 02:37:59

标签: iphone nsstring currency nsdecimalnumber nslocale

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

我有一个从货币格式化字符串返回十进制数字(用于存储核心数据)的方法。该字符串实际上是使用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'变量打印为:-184469124536074705320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

而在所有其他语言环境中,它将打印2.56以作为NSDecimalNumber存储到Core Data中。

3 个答案:

答案 0 :(得分:2)

设置属性:

[fmtrCurrencyFromStr setLenient:YES];

解决了法国,德国,挪威,英国,美国,日本,Nambia等问题......我不能说它为所有人解决了这个问题,因为我没有测试过所有这些问题,而是测试了我所有的问题。到目前为止测试,它已经工作。

答案 1 :(得分:0)

认为你的问题在于

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

尝试将其替换为大致等效的行

NSDecimalNumber * currencyNumber = [fmtrCurrencyFromStr numberFromString:strNumber];

你已经设置了generatesDecimalNumbers,所以除了一个令人烦恼的情况外,两者几乎相同:nil。

将消息发送到nil保证不执行任何操作,并且对于大多数标准类型(整数(旧的32位运行时不是64位整数除外),浮点,指针类型)返回0;如果方法返回结构,它“返回”未初始化的内存。 NSDecimal是一个结构。

(根本原因本质上是运行时不知道结构有多大,所以不知道有多少内存为零,因此你会得到“未初始化”的内存。我通常会在这个时候点击这个内存。 v.frame,但不确保v不是零。)

编辑:当然,您其他问题是NSNumberFormatter无法正确解析价格的原因。这是一个艰难的。我试着去掉货币符号。

答案 2 :(得分:0)

我在iOS 4.3上验证了使用[formatter setLenient:YES]标志,并且使用了Euros。如果未设置该标志,则格式化程序不会返回欧元的正确值。