方法一:
function format(number) {
return number && number.replace(/(?!^)(?=(\d{3})+\.)/g, ',')
}
零宽断言:
(?!exp)
: 匹配后面跟的不是 exp 的位置
(?=exp)
: 匹配 exp 前面的位置
捕获:
(exp)
: 匹配 exp, 并捕获文本到自动命名的组里
(?:exp)
: 匹配 exp, 不捕获匹配的文本,也不给此分组分配组号
方法二:
function format2(str) {
return str.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',')
}
分析:
- \B: 正则匹配边界,边界后面必须跟着 (\d{3})+(?!\d)
- (\d{3})+ : 必须是一个或多个的 3 个连续数字
- (?!\d): 第二步中的 3 个数字不允许后面跟着数字
- (\d{3})+(?!\d):匹配的边界后面必须跟着 3*n (n>=1) 的数字
方法三:
(123455666).toLocaleString()
手写一个:
function format2(str) {
const [front, end] = str.split('.'),
frontLen = front.length,
count = parseInt(frontLen / 3),
left = frontLen % 3;
let result = front.slice(0, left);
const repeatStr = front.slice(left);
for(let i = 0; i < count; i++) {
result += ',' + repeatStr.slice(i * 3, i * 3 + 3)
}
end && (result += '.' + end);
return result;
}
手写第二个:
function format4(str) {
let arr = [],
count = str.length;
while (count >= 3) {
arr.unshift(str.slice(count - 3, count));
count -= 3;
}
// 如果不是3的倍数就另外追加上去
const left = str.length % 3;
left && arr.unshift(str.slice(0, left))
return arr.toString()
}
网友评论