我必须使用国家/地区代码以货币格式显示一个数字,并根据国家/地区使用逗号和句点分隔符。
示例,如果数字4294967295000则
- 美国 = 4,294,967,295,000.00美元
- 印度 = 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
对象。 它通过一系列步骤来执行此操作,其中之一是:
- 如果 s 是"货币",则
a.让 c 将 c 转换为 6.1 中指定的大写。
b. 设置数字格式。[[货币]] 至 c.
这意味着,作为currency
选项传入的任何内容,只要它是正确的货币代码,都会转换为大写并存储在NumberFormat
对象的内部currency
属性中。
然后,我们看到NumberFormat
上还使用了其他一些内部属性 - 在本例中,特别是positivePattern
内部插槽。 规范说明:
;货币属性中的值还必须包含子字符串"{currency}"。模式字符串不得包含 Unicode 标准指定的常规类别"数字,十进制数字"中的任何字符。
IE 请注意,此时,对于给定的区域性,我们已经创建了一个对象,该对象实际上具有沿{currency} {number}
行的格式字符串。 只有在Chrome(至少)对美元的情况下,它是{currency}{number}
. 请注意,在 IE 和 Edge 中,您会获得 USD 后面的空间,因此它决定使用{currency} {number}
的格式字符串。
接下来,我们进入格式化数字的实际实现。 步骤7说:
- 如果 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);