我见过太多的例子,但没有一个让我相信我真正想要什么以及做到这一点的最佳实践。
我的代码如下:
const nf = new Intl.NumberFormat("es-MX");
let anualidad = 1200;
this.model.enero = nf.format(anualidad);
output: 1200
我的问题是它没有把逗号放在1,200
; 我并不是说它不起作用,因为如果我再输入一个零,它就会像这样添加逗号12,000
。
我已经将语言设置为MX。
我怎样才能以最好的方式做到这一点?因为有太多的计算必须以这种方式完成。
我对该主题进行了相当详尽的调查,我将根据从中获得的结果来回答。
首先,虽然已经讨论了使用另一个系统
locale
(例如)的可能性,但这并不能完全回答这个问题。en-US
显然,您想从 type 转换
Number
为 typeString
,但让它代表具有本地格式es-MX
(墨西哥西班牙语)的图形。如果我们使用方法
toLocaleString()
,或者NumberFormat
对象的方法Intl
,我们会得到以下结果:如果千位组的位数小于 2,它显然不会放小数点。
解决方案
解决这个问题的一种方法(我说问题,虽然它不是
bug
语言问题,而是标准化决定)是手动转换数字,因为标准没有给我们想要的结果。在你的问题中,你表示你见过很多形式,但没有一个能让你信服。事实是,为了口味,颜色。
这是我的建议,但我知道它可以通过许多其他方式完成。
我们创建自己的格式函数,由JavaScript 引擎的正则表达式引擎支持。
我们将使用以下正则表达式在所需的语言环境中格式化我们的数字:
在这个正则表达式中,做a
positive lookahead
(?=
),寻找一组或多组(+
),每组3位((\d{3})+
),如果有的话,match
连同分组为3的值一起返回。然后,做anegative lookahead
((?!)
)丢弃未按第一个捕获组分组的任何数字(在本例中为 1 或 2 位)。lookahead
您可以在Regex Lookahead中阅读有关它的更多信息。我们将使用String
replace
对象的方法,它接受一个正则表达式(我们已经拥有)和一个具有以下格式的类型参数:String
因此,我们的参数如下:
where
$1
代表第一个参数:我们的正则表达式,并且,
是我们将用于这种情况的分隔千位符号。最后,我们必须决定是否总是使用这种方法来替换该方法
toLocaleString()
,或者我们可以将两者结合起来。假设我们将始终将此方法用于任何有效的数值:
显然我们有一个严重的问题,因为有无效的结果。
问题是替换是在没有考虑小数位不应该是替换的一部分的情况下完成的。
为了解决这个问题,我们有一些选择,正如我之前所说:为了口味,颜色。
由于 Javascript 中的数字只能包含一个字符
.
或不包含任何字符,因此我们将使用它来将我们的函数仅应用于数字的整数部分。我们要将整数部分与小数部分分开,将格式应用于整数部分,然后将所有内容连接回
String
.有了这个,我们有一个函数可以帮助我们将数字转换为当地墨西哥格式的字符串表示形式(小数点和逗号用于千位分隔)。
将此应用于您的代码,您可以:
稍微修改一下这个方法,我们可以为我们想要的任何数字表示系统做到这一点。
为什么
toLocaleString()
或FormatNumber()
不将千位符号用于 1000 到 9999 之间的数字?这是Unicode标准组织做出的决定(我不知道为什么)。特别是CLDR(通用本地数据存储库)项目。
除其他事项外,该标准还建立了数字格式模式。在该模式中,有一个名为 的属性或属性
minimumGroupingDigits
,它将组中的最小位数设置为使用千位分隔符。事实是,在属于规范(包括墨西哥)的所有数字格式中,该值都等于 2(可以在CLDR 调查工具中看到)。
es
因此,上述方法将始终返回没有千位分隔符的 4 位整数。
我希望这可以消除您的疑问并帮助您解决问题。
根据 IETF 标签的文档,拉丁美洲和加勒比地区的代码
es-419
很有意义,因为在阿根廷、哥伦比亚或墨西哥,这种表达方式是相同的。你可以在这里查看
我一直在做一些测试,但不幸的是该标签不起作用。如果是这样,如果您不将任何内容传递给构造函数,它会采用您正在寻找的格式。
希望你能指导
编辑
做一些测试我使用了一个对象跟踪器
Intl.NumberFormat()
,发现Intl.NumberFormat().resolvedOptions()
有一个这种类型的对象这可能会根据所使用的浏览器而改变。我已将标签传递给构造函数
en-MX
,因为有时它可以工作(我在其他项目中看到过)或瞧!有效。我推荐以下内容:
它不适用于阿根廷 es-AR
使用德语格式,它给出了所需的结果: