一、正则表达式实现
可以用正则表达式实现,相关代码如下
1
2
3
4
5
6
7
8
moneyDelimiter(value) {
let v = (value || 0).toString();
if (v.includes('.')) {
return v.slice(0, v.indexOf('.')).replace(/(\d)(?=(?:\d{3})+$)/g, '$1,') + v.slice(v.indexOf('.'));
} else {
return (value || 0).toString().replace(/(\d)(?=(?:\d{3})+$)/g, '$1,');
}
}
二、转成英文格式
后来发现了一种更简单的方式
1
2
const toMark = num => num.toLocaleString('en-US')
toMark(1213865.123)
三、正则表达式中?=和?:和?!的理解
刚才正则表达式中用到了 ?=
,?:
和?!
,记录一下相关用法
理解?:
要理解?:则需要理解捕获分组和非捕获分组的概念:
- ()表示捕获分组,()会把每个分组里的匹配的值保存起来,使用$n(n是一个数字,表示第n个捕获组的内容)
- (?:)表示非捕获分组,和捕获分组唯一的区别在于,非捕获分组匹配的值不会保存起来
理解?=和?!
要理解?=和?!,首先需要理解前瞻,后顾,负前瞻,负后顾四个概念
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 前瞻:
exp1(?=exp2) 查找exp2前面的exp1
// 后顾:
(?<=exp2)exp1 查找exp2后面的exp1
// 负前瞻:
exp1(?!exp2) 查找后面不是exp2的exp1
// 负后顾:
(?<!exp2)exp1 查找前面不是exp2的exp1
var str="abZW863";
var reg=/ab(?=[A-Z])/;
console.log(str.match(reg));
var str="abZW863";
var reg=/ab(?![A-Z])/;
console.log(str.match(reg));