如何确保 Intl.NumberFormat 在使用同一国家/地区时不显示货币代码?

Posted

技术标签:

【中文标题】如何确保 Intl.NumberFormat 在使用同一国家/地区时不显示货币代码?【英文标题】:How to ensure Int.NumberFormat does not show currency code when using the same country? 【发布时间】:2021-05-26 04:49:29 【问题描述】:

给定一个区域设置fr-CA,在CAD 中显示货币值,我如何才能让国家代码显示?因为en-CA 显示"$1.00"fr-CA 显示"1.00 $ CAD" 没有明显的原因。

见下面的sn-p:

[
  'fr-CA',
  'en-CA',
  'en-US'
].forEach(locale => 
   document.getElementById('label_' + locale).innerhtml = new Intl.NumberFormat(locale,  style: 'currency', currency: 'CAD' ).format(0.25);
);
.currency 
  padding-right: 10px;


.error 
  color: white;
  background-color: red;
  font-weight: 900;
  padding: 0 10px;


.success 
  color: green;
<p>Should <strong>not</strong> display CAD because same country (fr-CA)</p>
<span class="currency" id="label_fr-CA"></span><span class="error">err!</span>
<p>Should not display CAD because same country (en-CA)</p>
<span class="currency" id="label_en-CA"></span><span class="success">OK</span>
<p>Should display CAD because different country (en-US)</p>
<span class="currency" id="label_en-US"></span><span class="success">OK</span>

为什么在两个具有相同国家代码的语言环境下国家显示不一致,这可以标准化吗?

** 编辑 **

这是我在浏览器中看到的,因为我的语言环境当前设置为 "fr" :

语言环境"fr-CA" 显示0,25 $ CA"en-CA" 显示$0.25;两个语言环境有相同的国家代码(即CA),这也与货币国家代码相同,那么为什么国家代码显示为"fr-CA""而不是"en-CA"

使用不同的浏览器,将语言环境设置为"en-CA",一切都会按应有的方式显示。那么,为什么Intl.NumberFormat 与它收到的值不一致,因为它询问 语言环境,但最终取决于它黑盒子内的浏览器语言环境?

【问题讨论】:

同一个国家和同一个“语言环境”不同 - 语言环境由navigator.language 确定 - 如果与您指定的格式不同,它将以不同的方式显示。要标准化这一点,请在格式选项中使用浏览器的 navigator.language 属性。 我住在加拿大,我们有两种官方语言。有些人将他们的navigator.language 设置为"fr",其他人设置为"en",但他们都住在同一个国家。为什么一个有国家代码而另一个没有?这对我来说似乎是一个疏忽。 我的问题是函数Intl.NumberFormat不使用navigator.language,而是要求传递语言环境。在这种情况下,如问题中所述,我将fr-CAen-CA 传递给CA 国家/地区代码,因此如果我要求显示CAD 货币符号,并且区域设置具有相同的国家/地区除了符号,一个不应该显示国家代码而另一个不显示! @RandyCasburn 我知道语言环境不是强制性的,但是当它提供时,它就是应该使用的,否则类的行为是未定义的。换句话说,使用相同的参数调用相同的函数应该提供相同的输出。 @RandyCasburn 相同的脚本在两个不同的浏览器中运行会在不同的浏览器中产生不同的结果。那是我的问题。我没有提供浏览器区域设置的功能,我提供具有特定区域设置的功能,但该功能的行为不同,因为两个浏览器都将navigator.language 设置为不同的值。这不在规格中。 【参考方案1】:

根据 Randy Casburn 的评论,我打开了 tc39 / ecma402 存储库的问题,讨论从那里转到 CLDR 但报告指出

250 加元 in fr-CA 应该是 250,00 $ en-CA 中的 250 加元应为 250.00 美元 250 CAD in fr-FR 应该是 250,00 $ CA 250 CAD 在 en-US 应该是 Can$250.00/CAN$250.00

换句话说,正如这个问题所问的那样。

解决方案是这很可能会在下一个版本中得到解决。截至目前,下一个版本是 v40,计划于 2021 年 10 月发布。

注意:当前行为跨浏览器不一致。例如,Firefox 目前没有表现出这种行为,但 Chrome 有。希望有一天,所有浏览器都将符合相同的规范。

【讨论】:

以上是关于如何确保 Intl.NumberFormat 在使用同一国家/地区时不显示货币代码?的主要内容,如果未能解决你的问题,请参考以下文章

Intl.NumberFormat 0或2个小数位

Intl.NumberFormat.formatToParts 不是函数

Intl.NumberFormat#format 最大整数值

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

Intl.NumberFormat 没有做数百万正确

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