千分位添加的方式,一般都是数组截取法,字符串截取法等等,但存在当为负数金额的时候,可能会存在 -,123.33 的情况,还需要考虑到负数的情况。(考虑情况较多)。使用正则匹配转化会省略考虑到一些情况,方便使用。下面我将正则法,数组转化截取法(字符串截取转化法和数组截取转化原理相同)的代码发在下面:
定义一个函数 moneyRegex ,形参number是要处理的金额数据,fix是需要对数据保留的小数位数。
正则法:建议使用正则匹配的方式添加千分位,可以直接避免负数、数组字符串之间转化的情况。如下代码:(推荐)
function moneyRegex(number,fix) {
if(fix){ //当传入保留小数位数时,先讲number保留相应相应小数,再添加千分位
number=number.toFixed(fix)
}
return !(number + '').includes('.') ?
(number + '').replace(/\d{1,3}(?=(\d{3})+$)/g, (match) => {
return match + ',';
}) :
(number + '').replace(/\d{1,3}(?=(\d{3})+(\.))/g, (match) => {
return match + ',';
})
}
console.log(moneyRegex(-122120101.23212564));
打印结果:
定义一个函数 moneyArray,形参number是要处理的金额数据,fix是需要对数据保留的小数位数。
数组转化截取法:
function moneyArray(number,fix) {
//0. 保留的小数位数
if(fix){
number=number.toFixed(fix)
}
//1. 先判断是否是负数
let isMinus=String(number).split('')[0]==='-';
let data=isMinus?String(number).split('').splice(1).join(''):number;
//2. 转为字符串,并按照.拆分
const arr = (data + '').split('.');
//3. 整数部分再拆分
const int = arr[0].split('');
//4. 小数部分
const fraction = arr[1] || '';
//5. 返回的变量
let r = '';
int.reverse().forEach(function(v, i) {
// 非第一位并且是位值是3的倍数,添加,
if (i !== 0 && i % 3 === 0) {
r = v + ',' + r;
} else {
r = v + r;
}
});
//6. 负号,整数部分和小数部分拼接
return isMinus ? '-'+ r + (!!fraction ? '.' + fraction : '') : r + (!!fraction ? '.' + fraction : '');
}
console.log(moneyArray(-122120201.23212564,2));
打印结果: