-
Notifications
You must be signed in to change notification settings - Fork 28
Open
Labels
面经面经面经
Description
格式化数字
要求:使用正则和非正则两种方式实现
评论区大神们,欢迎附上正则版~
// 法1:toLocaleString
// 浏览器提供该 api 对数字进行格式化,不过对于小数的处理使用的是四舍五入
let num = 1234567;
console.log(num.toLocaleString('en-US')); // 1,234,567
num = 12345.6785;
console.log(num.toLocaleString('en-US')); // 12,345.679
// 法2:数组操作
function format(num) {
if (typeof num !== 'number') return num;
const [ first, last ] = (num + '').split('.');
const flen = first.length;
const tmp = first.split('').reverse().reduce((res, n, i) => {
if ((i + 1) % 3 === 0 && i !== flen - 1) res.push(n, ',');
else res.push(n);
return res;
}, []).reverse().join('');
return last ? tmp + '.' + last : tmp;
}
// 法3:递归
function format(num) {
if (typeof num !== 'number') return num;
const [first, last] = (num + '').split('.');
function run(s) {
if (s.length <= 3) return s;
return run(s.slice(0, -3)) + ',' + s.slice(-3);
}
return last ? run(first) + '.' + last : run(first);
}
console.log(format(123456)); // 123,456
console.log(format(1234567)); // 1,234,567
console.log(format(12345.6785)); // 12,345.6785
console.log(format(123456.78)); // 123,456.78Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
面经面经面经