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

时间:2020-05-25 15:09:41

标签: ios swift locale

在我的模型中,我将价格存储为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

  • 对于"en_US""$3.543"
  • 对于"fr_CA""US$3.543"
  • 对于"de_DE""3,543 US$"
  • 对于"da_DK""3,543 US$"

如果我将formatter.currencyCode设置为DKK

  • 对于"en_US""DKK 3.543"
  • 对于"fr_CA""DKK 3.543"
  • 对于"de_DE""3,543 DKK"
  • 对于"da_DK""3,543 kr."

问题在于,在使用更多外来货币(例如DKK-丹麦克朗)的情况下,格式化程序使用currencyCode代替currencySymbol。我觉得用符号代替代码更有意义。

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

  • 对于"en_US""kr. 3.543"
  • 对于"fr_CA""kr. 3.543"
  • 对于"de_DE""3,543 kr."
  • 对于"da_DK""3,543 kr."

我该如何实现?还是应该坚持设置Locale.current而不碰它?

注意:我不能仅将NumberFormatter用于数字,然后手动添加货币符号,因为可以将符号分配给不同的货币:$3.543是{ {1}},但在en_US Locale中,这是加元的价格。

编辑,如评论中所建议,我将价格类型更改为fr_CA Locale

1 个答案:

答案 0 :(得分:3)

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

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

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

kr 123.45

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