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非常适合整数的格式化的场景。