// 数字添加千位符
const numToThousandChar = (num:number) => {
let numStr = num.toString().split(".");
let arr = numStr[0].split("").reverse();
let res:string[] = [];
let resStr: string = "";
for(let i = 0; i < arr.length; i++){
if(i % 3 === 0 && i !== 0){
res.push(",");
}
res.push(arr[i]);
}
res.reverse();
if(numStr[1]){
resStr = res.join("").concat(".",numStr[1]);
}else{
resStr = res.join("");
}
return resStr;
}
在一些场景中,为了让数字直观、易读,需要给一个数字添加千位符。
我想到了有3种结局方案
1. 使用正则匹配
2. 使用num.toLocalsString();
3. 如上述代码;
第一种方案,需要对正则比较熟悉,匹配各种模式,由于我比较懒,没有去世纪编码,但是理论上应该是可以实现的;
第二种方案,可以实现千位符效果,但是有一个弊端,默认的话小数部分给保留了3位,位数多了就给四舍五入掉了。不知道是不是我没有正确的使用toLocalsString()的配置像。我想这种方式依赖配置项,把我自己的效果交给运气,总不那么踏实,没有话费时间去验证。
我比较倾向于第三种方案,动手去实现了下。
第三种方案,没有任何的依赖,在任何环境下都能正常实现,比较符合我的预期,在代码的健壮性上是比较靠谱的。
大概的思路:
1. 将数字转化为数组去处理:数组数据结构方便处理;
2. 因为数字添加千位符,是从后向前添加,每3位加一逗号,为保证后面的3位足位,我把数组倒叙排列,然后每到了3的倍数索引的位置,添加一个逗号数组项;
3. 新建一个空数组和一个空字符串,用来承接处理后的结果;
4. 整数部分处理完后,如果原数有小数部分,则将处理后的整数部分和小数部分拼接一下,形成最终结果;