找了一些js實(shí)現(xiàn)千位分隔符的代碼,發(fā)現(xiàn)有些有漏洞,一個(gè)是不能處理帶有小數(shù)點(diǎn)的數(shù)渴频,一個(gè)是不能處理大數(shù),綜合兩個(gè)代碼北启,整理了一下卜朗,大概思路:
數(shù)先轉(zhuǎn)為字符串并判斷數(shù)是否有小數(shù),如有咕村,連小數(shù)點(diǎn)拿掉并暫存场钉,
再除以3得余數(shù),再根據(jù)‘余數(shù)’和‘3’將字符串拆分push到數(shù)組懈涛,
最后轉(zhuǎn)字符串再加上之前暫存的小數(shù)
代碼如下:
// 千位分隔符(js 實(shí)現(xiàn))
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
測(cè)試有效
后來看到同事發(fā)布的優(yōu)化方案逛万,覺得很棒
function splitK(num) {
var decimal = String(num).split('.')[1] || '';//小數(shù)部分
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('');//整數(shù)部分
return decimal?zs+'.'+decimal:zs;
}
var num = '123456789.123';
console.log(splitK(num));
//輸出:123,456,789.123
思路更簡單:
先分離出小數(shù)部分;
對(duì)整數(shù)部分逆序?yàn)閿?shù)組批钠;
每三個(gè)數(shù)字插入一個(gè)逗號(hào)宇植,如果是3的倍數(shù)位則最后一個(gè)不插入得封;
再逆序回來,拼接小數(shù)部分(如果有的話)指郁。
參考 給一個(gè)數(shù)值加千位分隔號(hào)
測(cè)試如果是數(shù)字類型可能提示undefined,對(duì)num加個(gè)String()即可