千分位格式化

实现数字的千分位分隔显示

问题

将数字格式化为千分位形式,如 1234567 转换为 1,234,567

解答

方法一:toLocaleString

function formatNumber(num) {
  return num.toLocaleString('en-US');
}

console.log(formatNumber(1234567));    // "1,234,567"
console.log(formatNumber(1234567.89)); // "1,234,567.89"

方法二:正则表达式

function formatNumber(num) {
  const parts = num.toString().split('.');
  // 匹配后面是3的倍数个数字的位置,插入逗号
  parts[0] = parts[0].replace(/\B(?=(\d{3})+$)/g, ',');
  return parts.join('.');
}

console.log(formatNumber(1234567));    // "1,234,567"
console.log(formatNumber(1234567.89)); // "1,234,567.89"

方法三:手动实现

function formatNumber(num) {
  const [integer, decimal] = num.toString().split('.');
  const arr = integer.split('');
  const result = [];
  
  // 从后往前,每3位加一个逗号
  for (let i = arr.length - 1, count = 0; i >= 0; i--) {
    result.unshift(arr[i]);
    count++;
    // 每3位且不是第一位时加逗号
    if (count % 3 === 0 && i !== 0) {
      result.unshift(',');
    }
  }
  
  return decimal ? result.join('') + '.' + decimal : result.join('');
}

console.log(formatNumber(1234567));    // "1,234,567"
console.log(formatNumber(1234567.89)); // "1,234,567.89"

方法四:Intl.NumberFormat

function formatNumber(num) {
  return new Intl.NumberFormat('en-US').format(num);
}

console.log(formatNumber(1234567));    // "1,234,567"
console.log(formatNumber(1234567.89)); // "1,234,567.89"

关键点

  • \B 匹配非单词边界,避免在开头插入逗号
  • (?=(\d{3})+$) 正向前瞻,匹配后面是 3n 个数字的位置
  • 需要单独处理小数部分,小数点后不加逗号
  • toLocaleStringIntl.NumberFormat 是原生 API,兼容性好且支持多语言