主要要實現四個符號
“#”:數字佔位符。只顯有意義的零而不顯示無意義的零。小數點後數字如大於”#”的數量,則按”#”的位數四捨五入。
”0”:數字佔位符。如果單元格的內容大於佔位符,則顯示實際數字,如果小於點位符的數量,則用0補足。
”.”:小數點
”,”:千位分隔符
後來因爲業務調整,千分位符不用實現了,見三個就打逗號, 0 和# 差不多也一併處理了,小數點,作爲核心 ,直接處理了
話不多說 ,直接上代碼
let formatNumber = (template = '###', number = '') => {
template = String(template);
number = String(number);
let modifiedNum,
target,
tempStr,
reTemp,
result,
tepRadixLocal = template.indexOf('.'),
numRadixLocal = number.indexOf('.'),
tepZeroLenght = template.slice(tepRadixLocal + 1).length;
//模板的小數點的後位數
numZeroLenght = number.slice(numRadixLocal + 1).length;
//先判斷是否有小數點
//根據小數點的位置不同 有無 做不同處理
if (tepRadixLocal != -1 && numRadixLocal == -1) {
tempStr = "0";
modifiedNum = number + '.';
for (let i = 0; i < tepZeroLenght; i++) {
modifiedNum = String(modifiedNum) + tempStr
}
} else if (tepRadixLocal != -1 && numRadixLocal != -1) {
if (tepZeroLenght < numZeroLenght) {
//四捨五入後的值
modifiedNum = number.substring(0, numRadixLocal + 1) + roundRadix(number.substring(numRadixLocal + 1), tepZeroLenght);
} else if (tepZeroLenght > numZeroLenght) {
modifiedNum = number;
for (let i = 0; i < tepZeroLenght - numZeroLenght; i++) {
modifiedNum = modifiedNum + '0';
}
} else if (tepZeroLenght == numZeroLenght) {
modifiedNum = number;
}
} else if (tepRadixLocal == -1 && numRadixLocal != -1) {
modifiedNum = number.slice(0, numZeroLenght);
} else if (tepRadixLocal == -1 && numRadixLocal == -1) {
modifiedNum = number;
}
target = modifiedNum.split('');
reTemp = target.slice(0, target.indexOf('.'));
//第一個數不用看
for (let i = reTemp.length - 2; i > 0; i--) {
if (i % 3 == 0) {
reTemp.splice(i, 0, ',');
}
}
result = reTemp.concat(target.slice(target.indexOf('.'))).join('');
return result;
}
//返回四捨五入
function roundRadix(number, target = '') {
number = String(number)
let arr = number.split('');
let str = '';
arr[target] >= 5 ? (arr[target - 1] = Number(arr[target - 1]) + 1) : '';
arr = arr.slice(0, target);
for (let i = 0; i < arr.length; i++) {
str += arr[i]
}
return str;
}