直接上代码【作为自己的工具函数记录使用】
步骤描述
1. 基本的数据判空、正负判断、小数与整数的各自截取处理
2. 数据的长度判断、数据反转、每3位增加千分位分隔符并进行回调,直到全部加完
3. 千分位符加完之后,处理数据的正负,以及数据回正
function setSeperate(num){
// 对数据进行初步的筛选
num = String(Number(num)) !== 'NaN' ? Number(num) : 0;
if(num == 0) return 0;
// 判断是整数还是负数
let isNagative = num < 0 ? true : false;
num = Math.abs(num);
// 判断这个数值是否有小数,进行分割(当这个数值是整数的时候,整数部分就是这个数)
let pointPosition = String(num).indexOf(".") == -1 ? String(num).length : String(num).indexOf(".");
// 整数部分
let integerStr = String(num).slice(0,pointPosition)
// 小数部分
let pointStr = String(num).slice(pointPosition)
// 给字符串加上千分位(整数部分)
function addCode(str,startIndex = 0){
// 如果这个数据整数部分没有超过三位数,直接返回
if(String(str).length <= 3) return str;
// 在初次处理数据之前,将数据进行翻转 654321 翻转之后得到 123456
if(startIndex == 0){
str = str.split("").reverse().join("")
}
// 当前用于操作的字符串的长度
str = str.slice(0,startIndex+3)+','+str.slice(startIndex+3)
// 这里加4表示:三个字符加上一个分隔符号
// 每加一次千分位符号之后,判断剩余的数字的个数(不包含分隔符),并更新截取位点
// 如 123456(翻转之后的数据) 这个起始截取位点是 0, 处理之后是 123,456, 则下一次截取位点就是4,从4这个数字开始继续下一轮处理
startIndex = startIndex + 4;
// 这个是用于下一次操作的数据,长度不超过3的时候也是直接返回,否则就继续回调
let surplusStr = str.slice(startIndex)
if(surplusStr.length > 3){
return addCode(str, startIndex)
}
// 返回数据,将数据的顺序回正 123,456 变成 654,321
return str.split("").reverse().join("")
}
// 将整数部分与小数部分拼接起来
let result = addCode(integerStr)+pointStr;
// 是负数的加上符号
return isNagative ? ('-'+result) : result;
}
console.log(setSeperate(99999.88));// 99,999.88
console.log(setSeperate(9999.88));// 9,999.88
console.log(setSeperate(99.88));// 99.88
console.log(setSeperate(0.988));// 0.988
console.log(setSeperate(12345678));// 12,345,678
console.log(setSeperate(5677777777777));// 5,677,777,777,777
console.log(setSeperate(-100000.01));// -100,000.01