var reg=/(\d)(?=(\d{3})+(\.\d+)?$)/g;
str = parseFloat(value).toFixed(2).toString().replace(reg,'$1,');我试了一下,以上正则的作用是格式化金额类型的数字,每隔千位加上","
主要是这一段(?=(\d{3})不太明白,(\.\d+)?$)还有这一段的$为什么要加在括号里面,有什么意义?
而且后面的反向引用$1如何理解?
比如说
输入10000 返回的是10,000.00
输入1000000 返回的是1,000,000.00
这么看来第2个例子第一次替换时$1是1,第2次替换是000了? 这个是为什么?
分不多了 麻烦各位JS大神解释一下 本人菜鸟
str = parseFloat(value).toFixed(2).toString().replace(reg,'$1,');我试了一下,以上正则的作用是格式化金额类型的数字,每隔千位加上","
主要是这一段(?=(\d{3})不太明白,(\.\d+)?$)还有这一段的$为什么要加在括号里面,有什么意义?
而且后面的反向引用$1如何理解?
比如说
输入10000 返回的是10,000.00
输入1000000 返回的是1,000,000.00
这么看来第2个例子第一次替换时$1是1,第2次替换是000了? 这个是为什么?
分不多了 麻烦各位JS大神解释一下 本人菜鸟
(\d) // 匹配一个数字
(?= // 后续环视, 也就是从当前位置开始以后的内容必须是:
(\d{3})+ // 3个数字一组的多个内容(最少要一组存在)
(\.\d+)? // 后面可能存在的 . 和 至少一个数字的全数字内容
$
) // 环视结束,实际位置没有发生变化,就好像你站在马路边看有车过来没有,没有你才过马路 /g; // 全局匹配
下面来说你的例子
输入10000 返回的是10,000.001 1|0000 -> | 假如是光标位置(下同),那么他后面是 000 0 $ 而不符合上面 全是3个数字一组
2 10|000 -> 那么他后面是 000 $ 符合上面 全是3个数字一组, 所以成功,替换内容
3 100|00 -> 那么他后面是 00 $ 而不符合上面 全是3个数字一组
4 1000|0 -> 那么他后面是 0 $ 而不符合上面 全是3个数字一组所以是 10,00010000001 1|000000 -> 000 000 ,替换
2 10|00000 -> 000 00
3 100|0000 -> 000 0
4 1000|000 -> 000 ,替换
5 10000|00 -> 00
6 100000|0 -> 0所以是1,000,000
最后一个0不画光标的原因 我想是因为后面出现的只可能是\.\d+ 因为toFixed(2)确定为两位小数
(\.\d+)? 这里的?我觉得应该改为+,因为肯定会有两位小数出现