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

Bra*_*ery 42 javascript regex formatting

我需要使用JavaScript在网页上显示格式化的数字.我想格式化它,以便在正确的位置有逗号.我如何使用正则表达式执行此操作?我已经得到了这样的东西:

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

...然后意识到这将比我想象的更复杂(上面的正则表达式甚至不能满足我的要求).我做了一些搜索,我很难找到适用于此的东西.

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

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

......你明白了.

Tim*_*ker 113

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

搜索(?<=\d)(?=(\d\d\d)+(?!\d))并替换所有,

在旧版本中,JavaScript不支持lookbehind,因此不起作用.幸运的是,我们只需要改变一点:

搜索(\d)(?=(\d\d\d)+(?!\d))并替换所有\1,

所以,在JavaScript中,它看起来像:

result = subject.replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");
Run Code Online (Sandbox Code Playgroud)

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

这也适用于小数(123456.78),只要"点右侧"没有太多数字(否则你得到123,456.789,012).

您还可以在Number原型中定义它,如下所示:

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

然后像这样使用它:

var num = 1234;
alert(num.format());
Run Code Online (Sandbox Code Playgroud)

图片来源:Jeffrey Friedl,掌握正则表达式,第3名.版,p.66-67

  • 这很棒,除非你进入花车:`0.1523234 - > 0.1,523,234` (2认同)
  • 忘了添加...如果你确实期望小于1的浮点数,那么在进行替换之前添加一个要求数字大于999的条件(这比尝试更复杂的RegExp以更小的浮点数更好)超过1可能最终效率很低). (2认同)

Spe*_*net 18

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

此代码扩展了Number对象; 用法示例如下.

码:

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

这个怎么运作

正则表达式使用前瞻来查找字符串中的位置,其中右边的唯一内容是一个或多个三个数字的分组,直到遇到小数或字符串结尾.将.split()被用来打破在那些点串入数组元素,然后将.join()合并的那些元件回字符串,用逗号分开.

在字符串中查找位置而不是匹配实际字符的概念对于拆分字符串而不删除任何字符非常重要.

用法示例:

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

n = 87345.87;
alert( n.format() );    // Displays "87,345.87"
Run Code Online (Sandbox Code Playgroud)

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

区域设置感知版本:

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( "." );
    }
};
Run Code Online (Sandbox Code Playgroud)

除非真的有必要,否则我更喜欢第一版的简单性.


Ada*_*ett 7

需要注意的是, JavaScript 中现在有Intl.NumberFormat和 ,Number.toLocaleString()用于此目的:

使用正则表达式的其他答案都针对小数进行了分解(尽管作者似乎不知道这一点,因为他们只测试了 1 或 2 位小数)。这是因为如果没有lookbehind,JS 正则表达式就无法知道您正在处理的是小数点之前还是之后的数字块。这就留下了两种使用 JS 正则表达式来解决这个问题的方法:

  1. 了解数字中是否有小数点,并根据情况使用不同的正则表达式:

    • /(\d)(?=(\d{3})+$)/g对于整数
    • /(\d)(?=(\d{3})+\.)/g对于小数
  2. 使用两个正则表达式,一个用于匹配小数部分,第二个用于对其进行替换。

function format(num) {
  return num.toString().replace(/^[+-]?\d+/, function(int) {
    return int.replace(/(\d)(?=(\d{3})+$)/g, '$1,');
  });
}

console.log(format(332432432))
console.log(format(332432432.3432432))
console.log(format(-332432432))
console.log(format(1E6))
console.log(format(1E-6))
Run Code Online (Sandbox Code Playgroud)

  • 如果您没有幕后支持,这可能是最好的方法。当用于屏蔽输入字段时,您可以使用正则表达式运行第一遍,在所需的位数处插入小数点,然后通过此方法运行结果,您将获得完美的逗号分布,而无需增加小数点。 (2认同)

小智 6

function numberWithCommas(x) {
    return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
var num=numberWithCommas(2000000); //any number
console.log(num);

enter code here
Run Code Online (Sandbox Code Playgroud)

尝试这个