数值千分位6种方法& 性能大比拼!

58 阅读2分钟

1 数值转字符串遍历

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

  1. 数字转字符串,字符串按照 .分割
  2. 整数部分拆分成字符串数组,并倒叙
  3. 遍历,按照每3位添加“,”号
  4. 拼接整数部分 + 小数部分`
function format_with_array(number) {
    // 转为字符串,并按照.拆分
  var arr = (number + '').split('.');
    // 整数部分再拆分
  var int = arr[0].split('');
    // 小数部分
  var fraction = arr[1] || '';
    // 返回的变量
  var r = "";
  var len = int.length;
    // 倒叙并遍历
  int.reverse().forEach(function (v, i) {
        // 非第一位并且是位值是3的倍数, 添加 ","
        // console.log(v);
      if (i !== 0 && i % 3 === 0) {
          r = v + "," + r;
      } else {
            // 正常添加字符
          r = v + r;
      }
  })
    // 整数部分和小数部分拼接
  return r + (!!fraction ? "." + fraction : '');
}

const print = console.log;
print(format_with_array(938765432.02));

image.png

2 字符串+ substring截取

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

  1. 数字转字符串,并按照 .分割
  2. 整数部分对3求模, 获取多余部分
  3. 按照3截取,并添加,
  4. 拼接整数部分 + 小数部分
function format_with_substring(number) {
    // 数字转字符串, 并按照 .分割
  var arr = (number + '').split('.');
  var int = arr[0] + '';
  var fraction = arr[1] || '';

  // 多余的位数
  var f = int.length % 3;
  // 获取多余的位数,f可能是0, 即r可能是空字符串
  var r = int.substring(0, f);
  // 每三位添加","和对应的字符
  for (var i = 0; i < Math.floor(int.length / 3); i++) {
      r += ',' + int.substring(f + i * 3, f + (i + 1) * 3)
  }

  //多余的位数,上面
  if (f === 0) {
      r = r.substring(1);
  }
  // 整数部分和小数部分拼接
  return r + (!!fraction ? "." + fraction : '');
}


const print = console.log;
print(format_with_substring(938765432.02));

image.png

除法+求模

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

  1. 值对1000求模,获得最高三位
  2. 值除以1000,值是否大于1 判定是否结束
  3. 重复1.2, 直到退出
  4. 拼接整数部分 + 小数部分
function format_with_mod(number) {
    var n = number;
    var r = ""; 
    var temp;
    do {
      	// 求模的值,用于获取高三位,这里可能有小数
        mod = n % 1000;
        console.log("mod="+mod);
      	// 值是不是大于1,是继续的条件(>=1,表示前面还有3位或者3位以上)
        n = n / 1000;
        console.log("n="+n)
      	// 高三位
        temp = ~~mod;
        console.log("temp="+temp);
      	// 1. 填充 : n>1 循环未结束, 就要填充为比如,1 => 001, 
        // 不然 1 001, 就会变成 '11',
      	// 2. 拼接 ","
        r =  (n >= 1 ?`${temp}`.padStart(3, "0"): temp) + (r ? "," + r : "")
    } while (n >= 1)

    var strNumber = number + "";
    var index = strNumber.indexOf(".");
  	// 拼接小数部分,
    if (index >= 0) {
        r += strNumber.substring(index);
    }
    return r;
}

const print = console.log;
print(format_with_mod(938765432.02));

image.png

正则先行断言等

image.png

function format_with_regex(number) {
    var reg = /\d{1,3}(?=(\d{3})+$)/g;
    return (number + '').replace(reg, '$&,');
}

Intl.NumberFormat

基本功能:国际化的数字处理方案,它可以用来显示不同国家对数字对处理偏好 语法:new Intl.NumberFormat([locales[, options]])

function format_with_Intl(number, minimumFractionDigits, maximumFractionDigits) {
    minimumFractionDigits = minimumFractionDigits || 2;
    maximumFractionDigits = (maximumFractionDigits || 2);
    maximumFractionDigits = Math.max(minimumFractionDigits, maximumFractionDigits);

    return new Intl.NumberFormat('en-us', {
        maximumFractionDigits: maximumFractionDigits || 2,
        minimumFractionDigits: minimumFractionDigits || 2
    }).format(number)
}


// 使用默认配置选项
// function format_with_Intl(number) {
//     return new Intl.NumberFormat('en-us').format(number)
// }


const print = console.log;
print(format_with_Intl(938765432.02));

image.png

toLocalString

功能:其能把数字转为特定语言环境下的表示字符串

语法:numObj.toLocaleString([locales [, options]])

function format_with_toLocaleString(number, minimumFractionDigits, maximumFractionDigits) {
    minimumFractionDigits = minimumFractionDigits || 2;
    maximumFractionDigits = (maximumFractionDigits || 2);
    maximumFractionDigits = Math.max(minimumFractionDigits, maximumFractionDigits);

    return number.toLocaleString("en-us", {
        maximumFractionDigits: maximumFractionDigits || 2,
        minimumFractionDigits: minimumFractionDigits || 2
    })
}


// function format_with_toLocaleString(number) {
//     return number.toLocaleString("en-us")
// }


const print = console.log;
print(format_with_toLocaleString(938765432.02));

image.png

总结

image.png