用于在JavaScript中格式化数字的正则表达式

问题描述 投票:41回答:12

我需要使用JavaScript在网页上显示带格式的数字。我想对其进行格式化,以便在正确的位置添加逗号。我将如何使用正则表达式执行此操作?我已经达到了这样的程度:

myString = myString.replace(/^(\d{3})*$/g, "${1},");

...然后意识到这比我想的要复杂(并且上面的正则表达式与我需要的甚至不接近相似)。我已经进行了一些搜索,但很难找到可以解决此问题的方法。

基本上,我想要这些结果:

  • 45变为45
  • 3856变为3,856
  • 398868483992变为398,868,483,992

...您明白了。

javascript regex formatting
12个回答
112
投票

这可以在单个正则表达式中完成,不需要迭代。如果您的浏览器支持ECMAScript 2018,则只需使用环视并在正确的位置插入逗号:

搜索(?<=\d)(?=(\d\d\d)+(?!\d)),并全部替换为,

[在旧版本中,JavaScript不支持向后搜索,因此不起作用。幸运的是,我们只需要更改一点:

搜索(\d)(?=(\d\d\d)+(?!\d)),并全部替换为\1,

因此,在JavaScript中,它看起来像:

result = subject.replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");

说明:断言,从字符串的当前位置开始,可以以三的倍数匹配数字,并且当前位置还剩一个数字。

这也适用于小数点(123456.78),只要“点右边”位数不太多(否则您将获得123,456.789,012)。

您还可以在Number原型中对其进行定义,如下所示:

Number.prototype.format = function(){
   return this.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,");
};

然后像这样使用它:

var num = 1234;
alert(num.format());

来源:Jeffrey Friedl,Mastering Regular Expressions, 3rd. edition,第1页。 66-67


0
投票

[首先反转一个字符数组,然后在每个第三个数字之后添加逗号,除非它刚好在字符串末尾或-号之前。然后再次反转字符数组,然后再次使其成为字符串。


0
投票

布兰登,


0
投票

警告:现在Intl.NumberFormatNumber.toLocaleString()在JavaScript中已用于此目的:


18
投票

格式化数字可以用一行代码优雅地处理。

此代码扩展了Number对象;使用示例如下。

代码:

Number.prototype.format = function () {
    return this.toString().split( /(?=(?:\d{3})+(?:\.|$))/g ).join( "," );
};

工作原理

正则表达式使用先行查找来查找字符串中唯一在其右边是三个数字的一​​个或多个分组的位置,直到遇到小数或字符串末尾为止。 .split()用于将这些点处的字符串分解为数组元素,然后.join()将这些元素合并回字符串,并以逗号分隔。

为了在不删除任何字符的情况下拆分字符串,在字符串中查找positions >>而不是匹配实际字符的概念很重要。

用法示例:

var n = 9817236578964235;
alert( n.format() );    // Displays "9,817,236,578,964,235"

n = 87345.87;
alert( n.format() );    // Displays "87,345.87"

当然,可以轻松地扩展或更改代码以处理区域设置注意事项。例如,这是该代码的新版本,该代码可自动检测区域设置并交换逗号和句点的使用。

支持区域设置的版本:

Number.prototype.format = function () {

    if ((1.1).toLocaleString().indexOf(".") >= 0) {
        return this.toString().split( /(?=(?:\d{3})+(?:\.|$))/g ).join( "," );
    }
    else {
        return this.toString().split( /(?=(?:\d{3})+(?:,|$))/g ).join( "." );
    }
};

除非真的有必要,但我更喜欢第一个版本的简单性。


4
投票

//您可能要考虑小数点


2
投票

如果您确实需要正则表达式,可以在while循环中使用两个:


1
投票

[有人提到在Javascript RegExp中无法进行向后看。这是一个很棒的页面,解释了如何使用环视(向前和向后)。



0
投票

尝试这样的事情:


0
投票

我认为您必须通过多次传递才能使用正则表达式实现此目的。尝试以下操作:


0
投票

不需要迭代

© www.soinside.com 2019 - 2024. All rights reserved.