Skip to content

实现数字的千分位逗号分割

Posted on:2021年7月25日 at 10:31

方案一:数组循环

function thousands(num) {
  var result = [],
    counter = 0;
  num = (num || 0).toString().split("");
  for (var i = num.length - 1; i >= 0; i--) {
    counter++;
    result.unshift(num[i]);
    if (!(counter % 3) && i != 0) {
      result.unshift(",");
    }
  }
  console.log(result.join(""));
}

thousands(314159265354);

方案二:字符串循环

直接获取字符串下标,不需要转数组

function thousands(num) {
  var result = "",
    counter = 0;
  num = (num || 0).toString();
  for (var i = num.length - 1; i >= 0; i--) {
    counter++;
    result = num.charAt(i) + result;
    if (!(counter % 3) && i != 0) {
      result = "," + result;
    }
  }
  console.log(result);
}
thousands(314159265354);

方案三:字符串不循环

直接根据截取

function thousands(num) {
  var num = (num || 0).toString(),
    result = "";
  while (num.length > 3) {
    result = "," + num.slice(-3) + result;
    num = num.slice(0, num.length - 3);
  }
  if (num) {
    result = num + result;
  }
  console.log(result);
}
thousands(314159265354);

方案四:正则

function thousands(num) {
  var num = (num || 0).toString(),
    reg = "/d{3}$/",
    result = ""; //匹配三个数字字符
  while (reg.test(num)) {
    result = RegExp.lastMatch + result; //返回上一次正则表达式搜索过程中最后一个匹配的文本字符串。
    if (num !== RegExp.lastMatch) {
      result = "," + result;
      num = RegExp.leftContext; //返回上一次正则表达式匹配时,被搜索字符串中最后一个匹配文本之前(不包括最后一个匹配)的所有字符。
    } else {
      num = "";
      break;
    }
  }
  if (num) {
    result = num + result;
  }
  console.log(result);
}
thousands(314159265354);

方案五:升级版正则

function thousands(num) {
  // \B 匹配非单词边界,匹配位置的左右两边都是 \w([a-zA-Z0-9_])
  // ?=是先行断言,表示这个位置后面的内容需要满足的条件,注意只是匹配一个位置,并不匹配具体的字符,所以是零宽;
  // ?!后行断言,表示这个位置后面的内容不能满足的条件,(?!\d)表示接下来的位置不是数字,可以是小数点
  // \d{3}匹配三个数字,+表示前面的内容重复1到多次,也就是匹配3个数字一到多次,3的倍数字符串
  // (?=(\d{3})+(?!\d))匹配一个位置,这个位置后面首先是3的倍数个数字的字符串,接下来的位置不是数字

  console.log(num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","));
}
thousands(314159265354.99);

方案六:凑整法

function thousands(num) {
  var num = (num || 0).toString(),
    temp = num.length % 3;
  switch (temp) {
    case 1:
      num = "00" + num;
      break;
    case 2:
      num = "0" + num;
      break;
  }
  console.log(num.match(/\d{3}/g).join(",").replace(/^0+/, ""));
}
thousands(314159265354);

方案七:toLocaleString

var num = 123456789;
//格式化千分位输出
num.toLocaleString();
//格式化为千分位带$符号输出
num.toLocaleString("en-US", { style: "currency", currency: "USD" });
//格式化为带¥符号输出
num.toLocaleString("zh-Hans-CN", { style: "currency", currency: "CNY" });
原文转自:https://fe.ecool.fun/topic/ccc4f906-dcd4-4eed-93b1-13ba4d853093