使用 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
:
"en_US"
:".543"
"fr_CA"
:"US.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
然后手动添加货币符号,因为符号可以分配给不同的货币:.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 对列表。
在我的模型中,我将价格存储为 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"
:".543"
"fr_CA"
:"US.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
然后手动添加货币符号,因为符号可以分配给不同的货币:.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 对列表。