js为数字添加千位分隔符

使用一条正则表达式将12345678转为12,345,678
看到一个方法"12345678".replace(/(\d)(?=(?:d{3})+$)/g, '$1,')
但是不太明白怎么实现的,或者大神们有没有更好的方法

多谢各位的解答,说说自己的理解:
主要是要搞懂?=的意思
x(?=y) 匹配'x'仅仅当x后面跟着'y'
(?:x) 仅分组,不记录匹配项

因此,replace(/(\d)(?=(?:d{3})+$)/g, '$1,')的意思就是对后面跟有三个或三的倍数个连续数字的数后面加上逗号
$1是第一个分组即(d)
(?:)实际上可以不要,可以将正则式改成/(d)(?=(d{3})$)/g

不过上面的方法只能处理整数
另外分享一个能同时处理小数和整数的方法:

function milliFormat(num) {
    return num && num.toString()
        .replace(/\d+/, function(s){
             return s.replace(/(\d)(?=(\d{3})+$)/g, '$1,')
         })
}

参考https://github.com/jiangjiu/b...

另外,感谢 @牧云云 的分享,使用toLocaleString的方法也可以实现同样的需求

阅读 20.6k
6 个回答

正则替换
/(\d)(?=(?:\d{3})+$)/g 匹配到字符串, 把第一个分组用$1表示,'$1,' 表示第一个分组后面加 ',' 。

去看看正则 : ?: ?= ()和$1 ===
这是针对有小数的情况
"12345678.32423432".replace(/(\d{1,2})(?=(\d{3})+\.)/g, '$1,')

还可以的方法:
字符串分析, 循环,然后3位加','
数字分析, 取到整数部分, %1000 操作, 然后加逗号 拼接字符串

最佳答案, 刚学习到拿出来分享
(12345678).toLocaleString("en-US") => "12,345,678"

更简洁直接
(12345678).toLocaleString() => "12,345,678"

这个正则表达式用处是每有四个连续的数字就把第一个数字替换为第一个数字加上,

我没有更好的但是有你能看懂的,你试试阔以吗

var str = 12345678 + "";
var newStr = str.split("").reverse().join("").replace(/([0-9]{3})/g,"$1,").split("").reverse().join("");

主要是要搞懂?=的意思
x(?=y) 匹配'x'仅仅当x后面跟着'y'
(?:x) 仅分组,不记录匹配项(非捕获型分组)

因此,replace(/(\d)(?=(?:\d{3})+$)/g, '$1,')的意思就是对后面跟有三个或三的倍数个连续数字的数后面加上逗号
$1是第一个分组即(\d),//g全局匹配时获得的值是2和5,因此分别在2和5后面加上了,

(?:)主要是为了不捕获后面的内容,它不会将匹配的内容进行编号存储在缓冲区,能提高效率
实际上(?=)类似与非捕获型分组,它内部的内容也不会捕获,因此(?:)可以省掉

新手上路,请多包涵

function thousandSplit(num){

          num = num+"";
          var num2 = num.split(".");
          var num3 = num2[0].split('').reverse().join("").replace(/(\d{3})/g,"$1,").split('').reverse().join("");
          var num4 =  (num3+(num2[1]?"."+num2[1]:'')).replace(/^,/g,'');
          return num4
  }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题