NSNumberFormatter - 获取货币代码的货币符号

Posted

技术标签:

【中文标题】NSNumberFormatter - 获取货币代码的货币符号【英文标题】:NSNumberFormatter - get currency symbol for currency code 【发布时间】:2021-05-12 23:46:36 【问题描述】:

这个问题类似于,但没有适用于该问题的答案 - NSNumberFormatter currency symbol


我正在使用 NSNumberFormatter 来格式化货币值,只要货币是用户区域设置的货币,它就可以正常工作。但我还需要显示可能不是用户区域设置的默认货币的货币值(例如,当当前区域设置为 en_US 时显示 GBP,或者当区域设置为 fr_FR 时显示 JPY)。

所以我想使用当前locale设置的规则来显示那些货币,但是设置货币代码后不知道如何获取货币符号。

例如,下面是 NSNumberFormatter 的配置方式:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.usesGroupingSeparator = YES;
formatter.numberStyle = NSNumberFormatterCurrencyStyle;
formatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US"];
(lldb) po [currencyFormatter stringFromNumber:[NSNumber numberWithDouble:12.50]] 12.50 美元 (lldb) po currencyFormatter.currencySymbol $ (lldb) po currencyFormatter.currencyCode 美元 (lldb) po currencyFormatter.internationalCurrencySymbol 美元

所有这些都是正确的。但是,如果我将货币代码设置为 GBP,如下所示:

currencyFormatter.currencyCode = @"GBP"

我得到以下格式字符串正确且货币代码正确,但货币符号和国际货币符号不正确的地方。

(lldb) po [currencyFormatter stringFromNumber:[NSNumber numberWithDouble:12.50]] 12.50 英镑 (lldb) po currencyFormatter.currencySymbol $ - 错了,应该是 £ (lldb) po currencyFormatter.currencyCode 美元 (lldb) po currencyFormatter.internationalCurrencySymbol USD - 错误,这应该是 GBP

但我真的很奇怪stringFromNumber 方法会返回格式正确的值,带有正确的货币符号,但直接访问 currencySymbol 属性会返回不正确的货币符号。

我需要能够访问货币符号,以便将其缩小并移动其基线,以使货币符号更小并与文本的其余部分偏移。

有谁知道我做错了什么或者设置货币代码后如何获取货币符号?

【问题讨论】:

【参考方案1】:

您将currencyCode 强制为“GPD”,但货币样式的其他属性为symbolinternationalCurrencySymbol,...它们取决于Locale。检查这个:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.usesGroupingSeparator = YES;
formatter.numberStyle = NSNumberFormatterCurrencyStyle;
formatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_UK"];

NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithDouble:123456]]);
NSLog(@"%@", formatter.currencySymbol);
NSLog(@"%@", formatter.currencyCode);
NSLog(@"%@", formatter.internationalCurrencySymbol);

它将打印:

£123,456.00
£
GBP
GBP

然后按照您的方式仅将货币代码编辑为USD

US$123,456.00
£
USD
GBP

【讨论】:

感谢您的回答。这也与我发现的一致。但我想弄清楚的是stringFromNumber 方法在设置货币代码后如何获得正确的货币符号。该方法如何工作,因为它获得了正确的符号。在您的示例中,使用 en_UK 语言环境和美元货币代码,它得到 US$ 作为货币符号,这是正确的。但它是如何做到的呢?我只需要能够在指定的语言环境中获取货币代码的货币符号,或者以某种方式从 stringFromNumber 结果中解析符号。 根据我的经验,Apple 文档并没有说太多。我认为他们有优先排序,例如:(currencyCode | currencySymbol) > locale。这些是可设置的属性,只要知道它是如何工作的,您就可以按照自己的方式对其进行自定义。 非常感谢。我最终设置了positiveFormat,以便货币符号被管道字符包围(只要没有使用区域设置,任何分隔符都可以工作),然后使用格式化程序的stringFromNumber 方法来格式化数字零(任何数字会工作),然后解析结果字符串以获取开始和停止分隔符并获取这些分隔符之间的子字符串。到目前为止,效果非常好。

以上是关于NSNumberFormatter - 获取货币代码的货币符号的主要内容,如果未能解决你的问题,请参考以下文章

NSNumberFormatter 货币符号

在 Swift 中使用 NSNumberFormatter 格式化货币输入

货币格式的 NSNumberFormatter.number 在设备中不起作用但在模拟器中起作用

使用swift从货币代码中获取货币符号

NSNumberFormatter paddingPosition 不起作用

iPhone:如何从Objective-C中的货币符号字符串中获取数字