使用 NumberFormatter 格式化货币替换默认区域设置货币代码

Format currency with NumberFormatter replace default locale currency code

在我的模型中,我将价格存储为 NSDecimalNumber 值。

struct Item {
    var price: NSDecimalNumber // eg. 3.543
    var currencyCode: String // eg. "USD"
}

我想使用用户的 Locale 正确显示它们。我找到了使用 NumberFormatter:

的解决方案
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.currencyCode = item.currencyCode

formatter.string(from: item.price)

不出所料,它会根据用户的区域设置给出不同的结果。

如果我将 formatter.currencyCode 设置为 USD:

如果我将 formatter.currencyCode 设置为 DKK:

问题在于,对于更多异国情调的货币(如 DKK - 丹麦克朗),格式化程序使用 currencyCode 而不是 currencySymbol。我觉得使用符号而不是代码更有意义。

理想情况下,如果我将 formatter.currencyCode 设置为 DKK,我希望:

我怎样才能做到这一点?还是我应该坚持 Locale.current 的设置方式而不去碰它?

注意:我不能只为数字使用 NumberFormatter 然后手动添加货币符号,因为符号可以分配给不同的货币:.543 是价格在 en_US Locale 中以美元计价,但在 fr_CA Locale 中以加元计价。

编辑 根据评论中的建议,我将价格类型更改为 NSDecimalNumber

如果您确实想使用问题中的格式,那么您可以在更改语言环境后单独设置货币符号

formatter.locale = Locale(identifier: "en_US")
formatter.currencySymbol = Locale.current.currencySymbol

if let str = formatter.string(for: 123.45) {
    print(str)
}

kr 123.45

如果货币没有符号,那么我建议使用货币代码,或者您需要维护自己的货币 code/sign 对列表。