JS 实现千分位格式化

# JS 实现千分位格式化

# 使用正则

/**
 *  @param {Number} num need Format number
 *  @param {Number = } decimals decimal digit
 *  @returns {String} thousand separator
 *  thousandSeparator(1234567)
 *  // => 1,234,567
 *
 *  thousandSeparator(1234567, 2)
 *  // => 1,234,567.00
 *
 *  thousandSeparator(1234567.9876)
 *  // => 1,234,567.9876
 *
 *  thousandSeparator(1234567.9876, 2)
 *  // => 1,234,567.99
 *
 */
function thousandSeparator(num, decimals) {
  if (num == null || isNaN(num)) {
    return '';
  }
  
  var _int = '';
  var _dec = '';

  if (decimals != null) {
    num = num.toFixed(decimals);
  }
  num = num.toString();

  if (num.toString().indexOf('.') !== -1) {
    _int = num.split('.')[0];
    _dec = num.split('.')[1];
  } else {
    _int = num;
  }
  _int = _int.replace(/(\d)(?=(?:\d{3})+$)/g, '$1,');
  if (_dec.length) {
    _dec = '.' + _dec;
  }
  return _int + _dec;
}

参考了网上大量的正则表达式, 发现都将小数也进行了逗号分隔, 这是不复合常理的, 所以我将整数和小数部分进行分离, 只对整数部分进行千分位分割。

# 使用 toLocaleString


/**
 *  @param {Number} num need Format number
 *  @param {Number = } decimals decimal digit
 *  @returns {String} thousand separator
 * 
 *  thousandSeparator(1234567)
 *  // => 1,234,567
 *
 *  thousandSeparator(1234567, 2)
 *  // => 1,234,567.00
 *
 *  thousandSeparator(1234567.9876)
 *  // => 1,234,567.988
 * 
 *  thousandSeparator(1234567.9876, 2)
 *  // => 1,234,567.99
 * 
 */
  
function thousandSeparator(num, decimals) {
  
  var opt = {}

  if(decimals != null) {
    opt.minimumFractionDigits = decimals // 最小小数位数
    opt.maximumFractionDigits = decimals // 最大小数位数
  }

  return num.toLocaleString(undefined, opt)
}
 

toLocaleString([locales [, options]]) 可以很方便对数字进行千分位分割
API支持两个可选参数。 具体解释查看MDN
    locales: String 格式化对象时使用的语言环境, 当值为 undefined时, toLocaleString 返回本地操作系统指定的格式
    options: Object 输出样式的配置参数
注意: maximumFractionDigits 默认值为 minimumfractiondigits和3中大的那一个, 所以不设置小数位数时, 默认值为3, 这就是 .9876 格式化为了 .988的原因。 所以toLocaleString非常适合整数的格式化的场景。