主要要实现四个符号
“#”:数字占位符。只显有意义的零而不显示无意义的零。小数点后数字如大于”#”的数量,则按”#”的位数四舍五入。
”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;
}