找了一些js实现千位分隔符的代码,发现有些有漏洞,一个是不能处理带有小数点的数,一个是不能处理大数,综合两个代码,整理了一下,大概思路:
数先转为字符串并判断数是否有小数,如有,连小数点拿掉并暂存,
再除以3得余数,再根据‘余数’和‘3’将字符串拆分push到数组,
最后转字符串再加上之前暂存的小数
代码如下:
// 千位分隔符(js 实现)
function thousandBitSeparator(str){
str = String(str);
if (str.indexOf('.')>=0) {
var postfix = str.substring(str.indexOf('.'));
str = str.substring(0,str.indexOf('.'));
}else{
var postfix = '';
};
// console.log(postfix);
// .99
// console.log(str);
// 9999999999999
var iNum = str.length % 3;
var prev = '';
var iNow = 0;
var temp = '';
var arr = [];
if (iNum != 0){
prev = str.substring(0, iNum);
arr.push(prev);
}
str = str.substring(iNum);
for (var i = 0; i < str.length; i++){
iNow++;
temp += str[i];
if (iNow == 3 && temp){
arr.push(temp);
temp = '';
iNow = 0;
}
}
// console.log(arr);
// ["9", "999", "999", "999", "999"]
return arr.join(',') + postfix;
}
// console.log(thousandBitSeparator('9999999999999.99'));
// 9,999,999,999,999.99
测试有效
后来看到同事发布的优化方案,觉得很棒
function splitK(num) {
var decimal = String(num).split('.')[1] || '';//小数部分
var tempArr = [];
var revNumArr = String(num).split('.')[0].split("").reverse();//倒序
for (i in revNumArr){
tempArr.push(revNumArr[i]);
if((i+1)%3 === 0 && i != revNumArr.length-1){
tempArr.push(',');
}
}
var zs = tempArr.reverse().join('');//整数部分
return decimal?zs+'.'+decimal:zs;
}
var num = '123456789.123';
console.log(splitK(num));
//输出:123,456,789.123
思路更简单:
先分离出小数部分;
对整数部分逆序为数组;
每三个数字插入一个逗号,如果是3的倍数位则最后一个不插入;
再逆序回来,拼接小数部分(如果有的话)。
参考 给一个数值加千位分隔号
测试如果是数字类型可能提示undefined,对num加个String()即可
网友评论