NumberFormatter 分组未按预期工作
Posted
技术标签:
【中文标题】NumberFormatter 分组未按预期工作【英文标题】:NumberFormatter grouping not working as expected 【发布时间】:2019-10-24 15:02:00 【问题描述】:在处理货币格式时,我在尝试格式化智利比索时发现了一个问题。
以下代码:
let priceFormatter = NumberFormatter()
priceFormatter.locale = Locale(identifier: "es_CL")
priceFormatter.numberStyle = .currency
priceFormatter.currencyCode = "CLP"
priceFormatter.string(from: 9990) // A
priceFormatter.string(from: 99900) // B
执行此操作,A 获得 9990 美元,B 获得 99.990 美元。 我想要为 A
实现 $9.990看起来格式化程序没有在第一种情况下添加千位分组分隔符,我不知道为什么。我尝试将groupingSize
设置为 3,但没有成功。
(这只发生在 4 位数字上)
【问题讨论】:
你说“我要实现”。但也许这实际上是智利的惯例:仅对大于 10000 的值添加千位分隔符。也许数字格式化程序比我们更清楚。 以下:thefinancials.com/Default.aspx?SubSectionID=curformat 我看到 CLP 被标记为 #.### 我支持你,但这并不能告诉我们 NumberFormatter 的想法。 :) 我的意思是,从这里无法判断这是一个错误还是意见分歧。如果您将语言环境更改为en_US
,您在这两种情况下都会得到分隔符。我倾向于相信 NumberFormatter 比我更了解当地的惯例。如果你改变你的期望,你可能会更快乐。 :)
我在一个网页上用你可以更改的 javascript 示例对此进行了测试,并得到了与 CLP 完全相同的行为,所以我认为我们可以假设 NumberFormatter 是正确的(或者至少与它的 javascript 对应项一样好) :))。
根据spanishnumbers.guide/numbers-in-spanish.html#decimals,“不得分隔只有四位数字的数字。”
【参考方案1】:
我遇到了同样的问题,在这里找到了解释: ios13: NumberFormatter missing groupingSeparator when try to format 4 digits numbers with es_ES locale
我最终设置了 us_US 语言环境:
let formatter = NumberFormatter()
formatter.locale = Locale(identifier: "us_US")
formatter.groupingSeparator = " "
formatter.usesGroupingSeparator = true
formatter.groupingSize = 3
【讨论】:
【参考方案2】:我试图实现同样的目标,我最终做的是:
let price: Double = 1000
let currencyFormatter = NumberFormatter()
currencyFormatter.numberStyle = .decimal
currencyFormatter.groupingSeparator = "."
currencyFormatter.maximumFractionDigits = 0
let balanceText = currencyFormatter.string(from: NSNumber(value: price))!
return "$" + balanceText
【讨论】:
以上是关于NumberFormatter 分组未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章