【问题标题】:Intl.NumberFormat currency: $US currency symbol?Intl.NumberFormat 货币:$US 货币符号?
【发布时间】:2019-02-23 21:31:24
【问题描述】:

我不明白 NumberFormat 的工作原理。

在法国,我们从不使用$US,为什么我会收到以下信息?

new Intl.NumberFormat("fr-FR",{
            style: 'currency',
            currency: 'USD',
            minimumFractionDigits: 2,
         }).format("345")
"345,00 $US"

new Intl.NumberFormat("fr-FR",{
            style: 'currency',
            currency: 'EUR',
            minimumFractionDigits: 2,
         }).format("345")
"345,00 €"

另外:以下内容对我来说也没有任何意义。我尝试了随机语言环境来查看影响并获得这 2 个不同的结果:

new Intl.NumberFormat("en-HOS",{
            style: 'currency',
            currency: 'USD',
            minimumFractionDigits: 2,
         }).format("345")
"345,00 $US"

new Intl.NumberFormat("en-HOSSDDG",{
            style: 'currency',
            currency: 'USD',
            minimumFractionDigits: 2,
         }).format("345")
"$345.00"

这个 API 是坏了还是我错过了什么?

【问题讨论】:

  • API 是为全世界而设计的,而不仅仅是美国/欧洲。有multiple dollar currencies
  • 当然,但是在法国没有人使用过$US,为什么api会返回那个?它不是打算用于现实生活中的格式化操作吗?
  • 作为加拿大人,如果我用美元购买但只显示“$”,我会假设它是加拿大的。 - 如果我的区域设置为“en-CA”并且我的购买是美元,它会显示“美元”。 - 如果我的语言环境设置为“en-US”并且我的购买是美元,它会显示“$”。

标签: javascript currency number-formatting intl


【解决方案1】:

在JS中格式化数字时需要使用narrow选项

“narrowSymbol”使用窄格式符号(“$100”而不是“US$100”),

const amount = 123444;
console.log(new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', currencyDisplay: 'narrowSymbol'}).format(amount));

详情请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat

【讨论】:

  • 是的,你需要一个 polyfill,例如 formatjs.io
【解决方案2】:

V8 JavaScript 引擎正在使用 i18N 的 ICU 库。

查看所有货币数据:https://github.com/unicode-org/icu/tree/master/icu4c/source/data/curr

但是法国人在谈论美元时肯定会使用 $ 而不是 $US

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-04
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 2012-01-29
    • 1970-01-01
    相关资源
    最近更新 更多