正则表达式:转换为正数

时间:2014-07-07 07:38:18

标签: javascript regex

我不熟悉正则表达式。我碰到了下面的代码,它应该允许负值和正值。当前函数自动将负值转换为正值。

    parseInputNum: function(val){ 
        var sep = val.lastIndexOf('.') > val.lastIndexOf(',')? '.' : ','; 
        var arr = val.replace(new RegExp('[^\\d'+sep+']+', 'g'), '').match(new RegExp('(\\d+(?:['+sep+']\\d+|))$')); 
        return arr? arr[1].replace(/[,]/g, '.') : false; 
    } 

我会说实话,我不熟悉正则表达式。

2 个答案:

答案 0 :(得分:2)

虽然Jerry的回答解决了OP的直接关注,但我认为理解其工作原理有更广泛的价值,首先要了解原始功能的用途是什么以及为什么修改可以解决问题

功能的目的

  1. 要将分隔符,全局更改为.
  2. 删除既不是数字也不是小数分隔符的无关字符。
  3. 将负数转换为正数这一事实并非其目的,而是-未被指定为有效字符的副作用。

    该功能实际上做了什么?

    上面的第一行只是确定小数分隔符是.还是,,因为有些国家/地区使用,作为小数分隔符。

        var sep = val.lastIndexOf('.') > val.lastIndexOf(',')? '.' : ','; 
    

    第二行做了两件事。

    1. 删除除了数字和检测到的分隔符之外的所有字符,方法是匹配它们并将其替换为空字符串''
    2. 执行匹配以验证结果字符串是否看起来像有效数字,该数字由"一个或多个数字"定义,可选地后跟单个分隔符和另一个有效序列数字。

      var arr = val.replace(new RegExp('[^\\d'+sep+']+', 'g'), '').match(new RegExp('(\\d+(?:['+sep+']\\d+|))$')); 
      
    3. 第三行首先检查第二行是否成功匹配,如果成功不匹配则返回false。如果匹配成功,则会返回结果字符串,并将所有,替换为.

      Jerry的修复。

      正如杰瑞在答案中正确描述的那样,修复是双重的。

      1. -添加到允许的字符集中,以便在删除无关字符时不会将其删除。
      2. 在匹配子句的开头添加一个可选的-,以便匹配不会拒绝负数。

答案 1 :(得分:1)

下面的内容是消除负面信号的原因:

val.replace(new RegExp('[^\\d'+sep+']+', 'g'), '')

更改为:

val.replace(new RegExp('[^\\d'+sep+'-]+', 'g'), '')
                                    ^

在此添加-意味着它不会删除它们。 [^\\d'+sep+'-]将匹配除数字和分隔符之外的所有字符。添加-表示它不再匹配-,因此不会将其删除。

然后这个位匹配数字。我不完全确定,但我相信你需要用这样的东西代替它:

match(new RegExp('(-?\\d+(?:['+sep+']\\d+|))$'));
                   ^^