在我的模型中,我将价格存储为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
。
答案 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
如果货币没有符号,那么我建议您使用货币代码代替,或者您需要维护自己的货币代码/符号对列表。