function numberThousands (number, thousandsSeperator = ',') {
return String(number).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1' + thousandsSeperator)
}
解释
首先理解一下: 正向肯定预查(look ahead positive assert) 和 正向否定预查(negative assert)
正向肯定预查(look ahead positive assert):
在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)“能匹配"Windows2000"中的"Windows”,但不能匹配"Windows3.1"中的"Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
正向否定预查(negative assert):
在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如"Windows(?!95|98|NT|2000)“能匹配"Windows3.1"中的"Windows”,但不能匹配"Windows2000"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
/(\d)(?=(\d\d\d)+(?!\d))/g 正则表达式图解:
假设有字符串 12345
,正则表达式 (\d)(?=(\d\d\d)+)
首先,匹配 1
,发现 1
后面有 234
,正向预查到了,所以 1
会被匹配到;再次向后,匹配 2
,发现 345
, 所以 2
也被匹配到,如下图
加上 (?!\d)
,还要保证正向预查的最后一个字符串 不能为数字
js 实现千分位符
function numberThousands2 (nums) {
let arr = nums.toString().split("").reverse();
return arr.reduce((total, current, index) => {
if (index % 3 === 0 && total) {
return current + "," + total;
} else {
return current + total;
}
}, "");
}