用数字格式设置货币替换默认区域设置货币代码 [英] Format currency with NumberFormatter replace default locale currency code

查看:36
本文介绍了用数字格式设置货币替换默认区域设置货币代码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

问题是,对于更奇特的货币(如丹麦克朗),格式化程序使用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是以美元表示的价格,但在fr_CA Locale中是以CAD表示的价格。

编辑按照评论中的建议,我将价格类型更改为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

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

这篇关于用数字格式设置货币替换默认区域设置货币代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆