千分位
1234567 -> 1,234,567
- 循环实现:
function sep(num) {
let s = String(num);
let res = '';
for(let i=s.length-1, j=0;i>=0;i--,j++) {
if (j%3 === 0 && j!==0) {
res+=','
}
res += s[i];
}
console.log(Number(res.split('').reverse().join('')))
//return res.split('').reverse().join('');
}
sep(1234567);
- 正则实现:
参考链接:MDN
function sep2(num) {
let res = '';
let tempNum = String(num).split('').reverse().join('');
tempNum.replace(/([0-9]{1,3})/ig, (m, p1, offset) => {
res += p1;
if (offset !== tempNum.length-1) {
res += ','
}
});
return res.split('').reverse().join('');
}
let s = sep2(1234567)
console.log(s);
/**
* 将数据转成千分位
* @param num 要转换的数字,可为整数或者浮点数
* @param dec 要保留的小数位
* @returns {string}
*/
formatThousands(num, dec) {
num = Number(num);
if (dec != null) {
num = num.toFixed(dec);
}
return `${num}`.replace(/^[-+]?\d+/, v => v.replace(/\d{1,3}(?=(\d{3})+$)/g, '$&,'));
}
注意: 后面的$很重要。
例如:下图中第一个,由于存在先行断言,则先判断数字后面是不是存在一组或者多组3位数字,发现存在一组,又由于默认为贪婪匹配,所以找到012,则将012替换成a,因此变成了a3456
对于第二个,先行断言是后面必须是以3个数字结尾,因此是a123456