我不熟悉正则表达式。我碰到了下面的代码,它应该允许负值和正值。当前函数自动将负值转换为正值。
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;
}
我会说实话,我不熟悉正则表达式。
答案 0 :(得分:2)
虽然Jerry的回答解决了OP的直接关注,但我认为理解其工作原理有更广泛的价值,首先要了解原始功能的用途是什么以及为什么修改可以解决问题
,
全局更改为.
。将负数转换为正数这一事实并非其目的,而是-
未被指定为有效字符的副作用。
上面的第一行只是确定小数分隔符是.
还是,
,因为有些国家/地区使用,
作为小数分隔符。
var sep = val.lastIndexOf('.') > val.lastIndexOf(',')? '.' : ',';
第二行做了两件事。
''
。执行匹配以验证结果字符串是否看起来像有效数字,该数字由"一个或多个数字"定义,可选地后跟单个分隔符和另一个有效序列数字。
var arr = val.replace(new RegExp('[^\\d'+sep+']+', 'g'), '').match(new RegExp('(\\d+(?:['+sep+']\\d+|))$'));
第三行首先检查第二行是否成功匹配,如果成功不匹配则返回false
。如果匹配成功,则会返回结果字符串,并将所有,
替换为.
。
正如杰瑞在答案中正确描述的那样,修复是双重的。
-
添加到允许的字符集中,以便在删除无关字符时不会将其删除。-
,以便匹配不会拒绝负数。答案 1 :(得分:1)
下面的内容是消除负面信号的原因:
val.replace(new RegExp('[^\\d'+sep+']+', 'g'), '')
更改为:
val.replace(new RegExp('[^\\d'+sep+'-]+', 'g'), '')
^
在此添加-
意味着它不会删除它们。 [^\\d'+sep+'-]
将匹配除数字和分隔符之外的所有字符。添加-
表示它不再匹配-
,因此不会将其删除。
然后这个位匹配数字。我不完全确定,但我相信你需要用这样的东西代替它:
match(new RegExp('(-?\\d+(?:['+sep+']\\d+|))$'));
^^