题目: 如何将一个浮点数点左边的数每三位添加一个逗号。(使用正则表达式的方式实现)。
function toMoney(num) {
return num && num
.toString()
.replace(/(\d)(?=(\d{3})+\.)/g, function ($1, $2, $3) {
console.log($1, $2, $3);
return $2 + ',';
});
}
console.log(toMoney(1234567891.12));
// 1 1 891
// 4 4 891
// 7 7 891
// 1,234,567,891.12
-
正向前瞻
(?=pattern)
的用法:在任何匹配pattern的字符串开始处匹配查找字符串
注:这是一个非捕获匹配,也就是说,该匹配不需要获取供以后使用。 -
分析:
- $1, $2, $3分别代表正则匹配的括号里的值。
(\d{3})+\.
说明匹配3个及3的倍数个数字加“.”结尾的 如:891.
、567891.
、234567891.
。(\d)(?=(\d{3})+\.)
说明只有匹配到该数字后有3个及3的倍数个数字加“.”结尾的该数字被匹配。比如:7891.
中的7
被匹配,4567891.
中的4
被匹配,1234567891.
中的1
被匹配。
- JS中的逻辑运算符:主要有三种:逻辑与
&&
、逻辑或||
和逻辑非!
当&&
和||
连接语句时,两边的语句会转化为布尔类型(Boolean),然后再进行运算。- 逻辑与
&&
运算规则-
两边条件都是true的时候,结果为true
-
只要有一个是false,结果就是false
-
如果左边的为false,右边的就不再判断了
var a = 2; if ('' && a++) { // 左边是空字符串,转换成布尔类型的就是false,右边的a++就不会进行计算了,直接跳到else,输出的a还是2。 console.log(a); console.log('jinlaila'); }else { console.log(a); // 2 console.log('chuqu'); }
-
当数值参与逻辑与运算时,结果为true,那么会返回的会是第二个为真的值;如果结果为false,返回的会是第一个为假的值。
即:只要“&&”前面是false,无论“&&”后面是true还是false,结果都将返“&&”前面的值;只要“&&”前面是true,无论“&&”后面是true还是false,结果都将返“&&”后面的值;
一句话:&&
运算符假前真后。
-
- 逻辑或
||
运算规则- 只要有一个是true,结果就是true
- 两个都是false的时候结果才是false
- 当左边是true的时候,后面就不会进行判断了
- 只要“||”前面为false,不管“||”后面是true还是false,都返回“||”后面的值。只要“||”前面为true,不管“||”后面是true还是false,都返回“||”前面的值。
一句话:||
运算符真前假后。
- 逻辑与
回到一开始的函数中,根据假前真后的规则,如果&&前面是false比如我输入的如果是null
那么他返回的就是num本身,如果我输入的是正常的数字,它就会根据正则匹配然后替换并返回这个结果。
这个题目的另外一个解法:
function money(num) {
return num && num
.toString()
.replace(/(?!^)(?=(\d{3})+\.)/g, ',');
}
console.log(money(123123123.12)); // 123,123,123.12
还有其他非正则化的解法:戳这里。