使用NSNumberFormatter从国际货币字符串中获取十进制值

pie*_*red 20 iphone cocoa currency objective-c nsnumberformatter

似乎NSNumberFormatter无法将欧元(可能还有其他)货币字符串解析为数字类型.有人可以证明我错了.

我正在尝试使用以下内容从货币字符串中获取数字金额:

NSNumberFormatter *currencyFormatter = [[[NSNumberFormatter alloc] init] autorelease];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
NSNumber *currencyNumber = [currencyFormatter numberFromString:currencyString];
Run Code Online (Sandbox Code Playgroud)

这适用于英国和美国的货币金额.它甚至可以处理$和£以及数千个分离器而没有任何问题.

但是,当我使用欧元货币金额(在设置应用程序中将区域格式设置为法国或德国)时,它返回一个空字符串.以下所有字符串都失败:

12,34 €
12,34
12.345,67 €
12.345,67
Run Code Online (Sandbox Code Playgroud)

值得注意的是,这些字符串与使用相应语言环境时NSNumberFormatter的stringFromNumber方法完全匹配.

在设置应用中将区域格式设置为法国,然后在以下代码中将currencyNumber设置为12.34,导致currencyString设置为'12,34€':

NSNumberFormatter *currencyFormatter = [[[NSNumberFormatter alloc] init] autorelease];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
NSString *currencyString = [currencyFormatter stringFromNumber:currencyNumber];
Run Code Online (Sandbox Code Playgroud)

显然很容易就欧元问题解决这个问题,但我希望在尽可能多的国家销售这个应用程序,我认为其他语言环境肯定会发生类似的情况.

有人有答案吗?

TIA,Duncan

Sed*_*ien 20

这是一个困难的问题.执行以下工作没有问题:

double moneyAmount = 1256.34;
NSLocale *french = [[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"]; 
NSNumberFormatter *currencyStyle = [[NSNumberFormatter alloc] init];

[currencyStyle setLocale:french];
[currencyStyle setNumberStyle:NSNumberFormatterCurrencyStyle];
NSNumber *amount = [NSNumber numberWithDouble:moneyAmount];
NSString *amountString =  [currencyStyle stringFromNumber:amount];

NSNumber *pAmount = [currencyStyle numberFromString:amountString]; // == 1256.34
Run Code Online (Sandbox Code Playgroud)

但是,该-currencyGroupingSeparator方法的输出返回字符串\u00a0,一个不间断的空格,而不是预期的空格,.

OS X/iOS上的格式化程序类(以及正则表达式类)使用ICU库,也被其他项目使用.我发现至少有2个其他错误报告与关于这个具体问题.但是,这似乎是预期的行为.(我花了一些时间筛选ICU来源,找到它的定义,但它是一个迷宫.)

我的建议暂时是传递-setLenient:YES给货币格式化程序.甚至可能会用Apple的雷达报告错误报告.

  • `setLenient:`是黄金. (2认同)