0

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

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

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

4

3 回答 3

2

设置属性:

[fmtrCurrencyFromStr setLenient:YES];

解决了法国、德国、挪威、英国、美国、日本、纳米比亚等国家的问题……我不能说它解决了所有问题,因为我还没有测试过所有问题,但到目前为止我测试过的所有问题,它奏效了。

于 2010-11-30T22:49:55.630 回答
0

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

于 2011-10-28T08:08:10.697 回答
0

认为您的问题出在线路上

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

尝试用最等效的行替换它

NSDecimalNumber * currencyNumber = [fmtrCurrencyFromStr numberFromString:strNumber];

你已经设置generatesDecimalNumbers了,所以这两者几乎是等价的,除了一个恼人的情况:nil。

对于大多数标准类型(整数(旧的 32 位运行时中的 64 位整数除外)、浮点、指针类型),向 nil 发送消息保证什么都不做并返回 0;如果方法返回一个结构,它会“返回”未初始化的内存。NSDecimal 是一个结构。

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

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

于 2010-11-21T05:16:47.127 回答