# 数字的千分位分隔
这个需求主要在金融软件上会比较常用
之前看到过很多版本,比如有正则替换的,但是我觉得用正常的思维来实现代码的可读性会比较好。
思路如下:如果一个数是整数的话,不需要考虑小数,如果是小数的话考虑一下保留多少位有效数字,剩下的就是将整数部分从右往左处理,三个为一组,最终拼起来得到最后的结果
function toThousand(num, precision = 2) {
if (typeof num !== "number") {
throw new TypeError("num must be a number");
}
if (Number.isNaN(num)) {
return num;
}
// 整数才处理,小数不处理
const numStr = String(
Math.floor(num) === num ? num : num.toPrecision(precision)
);
const part = numStr.split(".");
let result = "";
let offset = part[0].length - 3;
// 从右往左3个为一组提取数字
while (offset > -3) {
const substr = part[0].substring(offset < 0 ? 0 : offset, offset + 3);
// 如果当前结果是'',直接处理结果,否则会多加一个,
result = result ? substr + "," + result : substr;
offset = offset - 3;
}
// 小数部分直接加到后面就好了
if (part.length === 2) {
result += "." + part[1];
}
return result;
}