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大神解释一下 本人菜鸟
  

解决方案 »

  1.   

    var reg=/
          (\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
      

  2.   

        你是我见过的第一个对正则分析得这么透彻的,这些东西绝对不是GOOGLE或百度就能找些东西来忽悠人的,没有真才实料的技术是无法进行这么详细描述的,同时也佩服你的耐心!
      

  3.   

    多谢独自流浪兄的解释,非常感谢你的热心帮助
    最后一个0不画光标的原因 我想是因为后面出现的只可能是\.\d+  因为toFixed(2)确定为两位小数
    (\.\d+)?  这里的?我觉得应该改为+,因为肯定会有两位小数出现