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 分组未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

Vuetify 数据表分组与分页未按预期工作

Vue计算属性未按预期工作[关闭]

稀疏分类交叉熵未按预期工作

C中的电源功能未按预期工作

C中的无符号字符未按预期工作

sec:authorize 在 Spring 启动应用程序中使用 Thymeleaf 时未按预期工作