如何在 JavaScript 中使用 localeString 获取货币代码和金额之间的空格?



我必须使用国家/地区代码以货币格式显示一个数字,并根据国家/地区使用逗号和句点分隔符。

示例,如果数字4294967295000则

  1. 美国 = 4,294,967,295,000.00美元
  2. 印度 = 42,94,96,72,95,000.00印度卢比

我让它适用于印度,但对于美国,我得到了这个字符串,但我需要在货币代码和数字之间留出空格:

var number = 4294967295000;
console.log(number.toLocaleString('en-IN', {
style: 'currency', currency: 'INR', currencyDisplay: 'code'
}));     // INR 42,94,96,72,95,000.00
console.log(number.toLocaleString('en-US', {
style: 'currency', currency: 'USD', currencyDisplay: 'code'
}));     // USD4,294,967,295,000.00

如何实现"美元"和数字之间的间距?我没有在有关空间的选项参数中看到任何内容。我可以编写自定义代码来增加空间,但我正在尝试查看是否有更好的选择来做同样的事情。

我没有在选项参数中看到任何关于空间的内容。

于是我下了兔子洞。

当您将选项传递给toLocaleString时,它会遵循许多步骤。 首先,它将您传入的选项转换为NumberFormat对象。 它通过一系列步骤来执行此操作,其中之一是:

  1. 如果 s 是"货币",则
    a.让 c 将 c 转换为 6.1 中指定的大写。
    b. 设置数字格式。[[货币]] 至 c.

这意味着,作为currency选项传入的任何内容,只要它是正确的货币代码,都会转换为大写并存储在NumberFormat对象的内部currency属性中。

然后,我们看到NumberFormat上还使用了其他一些内部属性 - 在本例中,特别是positivePattern内部插槽。 规范说明:

这些属性的值必须是包含子字符串"{number}"的字符串值

;货币属性中的值还必须包含子字符串"{currency}"。模式字符串不得包含 Unicode 标准指定的常规类别"数字,十进制数字"中的任何字符。

IE 请注意,此时,对于给定的区域性,我们已经创建了一个对象,该对象实际上具有沿{currency} {number}行的格式字符串。 只有在Chrome(至少)对美元的情况下,它是{currency}{number}. 请注意,在 IE 和 Edge 中,您会获得 USD 后面的空间,因此它决定使用{currency} {number}的格式字符串。

接下来,我们进入格式化数字的实际实现。 步骤7说:

  1. 如果 numberFormat 的值。[风格]]是"货币",然后
    是 a。让货币是数字格式的值。[[货币]]。
    b. 如果数字格式。[[currencyDisplay]] 是"代码",然后是
    i。让CD成为货币。
    三.否则,如果数字格式。[[currencyDisplay]] 是"符号",然后
    是 i。让 cd 是一个 ILD 字符串,以简写形式表示货币。如果实现没有这样的货币表示形式,则使用货币本身。
    d. 否则,如果数字格式。[[currencyDisplay]] 是"名称",然后是
    i。让 cd 是一个 ILD 字符串,以长格式表示货币。如果实现没有这样的货币表示形式,则使用货币本身。
    e.将结果中的子字符串"{currency}"替换为 cd

强调我的,显示在这种情况下采取的步骤。


TL;DR- 此行为似乎取决于浏览器,如果您始终需要空间,则需要自己解析和修复生成的字符串,没有内置方法可以这样做。

如果这是一个可靠的模式,你想要修复的是一个三个字母的代码,后跟一个数字,并且你想通过插入一个空格来修复它,你可以像这样使用这个正则表达式:

currencyStr = currencyStr.replace(/^([A-Z]{3})(d)/, (match, $1, $2) => $1 + ' ' + $2);

最新更新