跳到主要内容

千分位

2023年02月09日
柏拉文
越努力,越幸运

方案一、分割循环遍历


思路: 数字转字符串,整数部分低位往高位遍历

  1. 数字转字符串,字符串按照.分割

  2. 整数部分拆分成字符串数组,并倒序

  3. 遍历,按照每3位添加.

  4. 拼接整数部分+小数部分

实现:

function formatThousands(value){
const valueCopy = String(value);
const cacheList = valueCopy.split(".");
const int = cacheList[0];
const fraction = cacheList[1] || "";
const intCacheList = int.split("");
let result = "";
intCacheList.reverse().forEach((value,index)=>{
if(index !==0 && index%3 === 0){
result = value + "," + result;
}else{
result = value + result;
}
});
return result + (!!fraction ? "." + fraction : "");
}

const num = 4453232566.988;
console.log(formatThousands(num));

方案二、截取循环遍历


思路: 数字转化成字符串,整数部分高位往低位遍历,三位分组

  1. 数字转字符串,并按照.分割

  2. 整数部分对3求模,获取多余部分

  3. 按照3截取,并添加

  4. 拼接整数部分 + 小数部分

实现:

function formatThousands(value) {
const valueCopy = String(value);
const cacheList = valueCopy.split(".");
const int = cacheList[0];
const fraction = cacheList[1] || "";

const intLen = int.length;
const extraLen = intLen % 3;
let result = int.substring(0, extraLen);
for (let i = 0; i < Math.floor(intLen / 3); i++) {
result += "," + int.substring(extraLen + i * 3, extraLen + (i + 1) * 3);
}
if (extraLen === 0) {
result = result.substring(1);
}
return result + (!!fraction ? "." + fraction : "");
}

const num = 4453232566.988;
console.log(formatThousands(num));

方案三、数值除法求模(性能最好)


思路: 求模的值添加,,求余值(是否大于1)计算是否能够结束

  1. 值对1000求模,获得最高三位

  2. 值除以1000,值是否大于1判定是否结束

  3. 重复1.2,直到退出

  4. 拼接整数部分 + 小数部分

实现

function formatThousands(value) {
let numberValue = Number(value);
let temp;
let result = "";
do{
mod = numberValue % 1000;
numberValue = numberValue /1000;
temp = ~~mod;
result = (numberValue >= 1 ? `${temp}`.padStart(3,'0'):temp) + (!!result ? "," + result : "")
}while(numberValue >= 1)

let strValue = String(value);
let index = strValue.indexOf(".");
if(index !== -1){
result += strValue.substring(index);
}
return result;
}

const num = 4453232566.988;
console.log(formatThousands(num));

方案四、正则先行断言之回调函数


实现

function groupValue(value, index, flag) {
const reg = new RegExp(`\\d{1,${index}}(?=(\\d{${index}})+$)`, "g");
return String(value).replace(reg, function (match, ...args) {
return match + flag;
});
}
function formatThousands(value) {
const strValue = String(value);
const cacheList = strValue.split(".");
const int = cacheList[0];
const fraction = cacheList[1];
const result = groupValue(int, 3, ",");
return result + (!!fraction ? "." + fraction : "");
}

const num = 4453232566.9888;
console.log(formatThousands(num));

方案五、格式化函数 toLocalString(性能不好)


实现

function formatThousands(value){
const valueNumber = Number(value);
return valueNumber.toLocaleString("en-us");
}

const value = "2443434.3432432";
console.log(formatThousands(value));

方案六、格式化函数 Intl.NumberFormat(性能不好)


实现

function formatThousands(value){
return new Intl.NumberFormat("en-us").format(value);
}

const value = "2443434.3432432";
console.log(formatThousands(value));