千分位格式化
实现数字的千分位分隔显示
问题
将数字格式化为千分位形式,如 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 个数字的位置- 需要单独处理小数部分,小数点后不加逗号
toLocaleString和Intl.NumberFormat是原生 API,兼容性好且支持多语言
目录