为啥 Intl.NumberFormat 不适用于 Safari 和 Firefox 中的单位?

Posted

技术标签:

【中文标题】为啥 Intl.NumberFormat 不适用于 Safari 和 Firefox 中的单位?【英文标题】:Why doesn't Intl.NumberFormat work with units in Safari and Firefox?为什么 Intl.NumberFormat 不适用于 Safari 和 Firefox 中的单位? 【发布时间】:2020-06-19 08:36:52 【问题描述】:

我正在尝试使用here 给出的关于格式化数字的示例。

console.log((16).toLocaleString('en-GB', 
    style: "unit",
    unit: "liter",
    unitDisplay: "long"
));

我在 chrome 中尝试过,效果很好。但是,在 Safari 和 Firefox 中,我分别收到以下错误 Error: style must be either "decimal", "percent", or "currency"Error: invalid value "unit" for option style

在查看浏览器兼容性后,我从文档中认为它应该适用于所有浏览器。我试图寻找答案,但我找不到关于这个问题的任何信息。有谁知道这是为什么,或者我可以在哪里找到更多信息?

【问题讨论】:

javascript解释器代表数百万行代码,如果您发现错误,您可以打开错误票通知他们 我明白了。我只是想知道这是一个错误还是它毕竟不受支持。找不到任何相关信息。 如果相同的 js 代码在 2 个不同的解释器上给出 2 个不同的结果,则很有可能这是一个解释器错误。 很遗憾,我们已经放弃了列出所有未知错误的清单,可能是因为太多了! 【参考方案1】:

问题来自style字段的值unit

根据ECMA-402, 6th edition, June 2019 ECMAScript® 2019 Internationalization API Specification:

该字段的值必须是一条记录,它的名称必须具有“十进制”、“百分比”和“货币”三种数字格式样式的名称。

根据Draft ECMA-402 / February 27, 2020 ECMAScript® 2020 Internationalization API Specification:

该字段的值必须是一个Record,它的字段名称必须是“十进制”、“百分比”、“货币”、和“单位”这四种数字格式样式 .

Firefox 和 Safari 正在实施 ECMA-402 规范的第 6 版,而 Chrome 正在实施同一规范的草案版本。规范草案可以随时更改,并且没有正式保证这个新的unit 值将包含在第 7 版中。如果你想跨浏览器兼容和面向未来,你应该坚持使用第 6 版并等待第 7 版的发布,然后再使用这些新功能。

如果您想了解详细信息,可以阅读proposition for this new feature。

【讨论】:

感谢您清理它。我认为 MDN 应该在他们的文档中澄清这一点,因为在查看浏览器兼容性部分时,它有点误导。 The proposal 已于 2020 年 3 月 23 日更新为以下状态:“此提案已合并到 ECMA-402 中,并计划用于 2020 年版规范。” See here 了解此功能当前的浏览器兼容性。

以上是关于为啥 Intl.NumberFormat 不适用于 Safari 和 Firefox 中的单位?的主要内容,如果未能解决你的问题,请参考以下文章

Intl.NumberFormat#format 最大整数值

Intl.NumberFormat 中的多个语言环境?

如何将 Intl.NumberFormat 与本机反应一起使用?

Intl.NumberFormat 没有做数百万正确

使用不带货币符号的 Intl.NumberFormat 进行货币格式化

Intl.NumberFormat 返回数字和货币符号通过间距划分的结果