使用正则表达式掩码实时控制浮点输入

我已经实现了控制数字和浮点数的function。 但它对浮点数不起作用,必须像这样的表达式:

// I wish a number like x figures . 3 figures (example : 123456.123) /^([1-9][0-9]*|0)(\.[0-9]{3})?$/ 

但是这个表达式让人不知所措……

以下作品/(^\d+$)|(^\d+\.\d+$)|[,.]/ ,但可以添加多个点:

 $('.float_input').live("keypress",function(){inputControl($(this),'double');}); function inputControl(input,format) { var value=input.val(); if (format=='int'){expression=/(^\d+$)|(^\d+\.\d+$)/;} else if (format=='double'){expression=/(^\d+$)|(^\d+\.\d+$)|[,.]/;} var values=value.split(""); var update=""; for(id in values) { if (expression.test(values[id])==true && values[id]!='') { // also replace ',' by '.' update=update+''+values[id].replace(',','.'); } } input.val(update); } 

所以我有多个点或没有点,它让我坚果,因为我肯定会接近解决方案…提前感谢您的帮助。

编辑>解决方案

哎呀,感谢关于正则表达式的帮助,我找到了解决方案!

需要进行两项测试:

  • 一个用于caracters测试,逐个测试
  • 另一个在输入caracters时测试整个输入

这是最后的剧本,就像一朵花,我只是为你分享:

 $('.numeric_input').live("keyup",function(){inputControl($(this),'int');}); $('.float_input').live("keyup",function(){inputControl($(this),'float');}); function inputControl(input,format) { var value=input.val(); var values=value.split(""); var update=""; var transition=""; if (format=='int'){ expression=/^([0-9])$/; finalExpression=/^([1-9][0-9]*)$/; } else if (format=='float') { var expression=/(^\d+$)|(^\d+\.\d+$)|[,\.]/; var finalExpression=/^([1-9][0-9]*[,\.]?\d{0,3})$/; } for(id in values) { if (expression.test(values[id])==true && values[id]!='') { transition+=''+values[id].replace(',','.'); if(finalExpression.test(transition)==true) { update+=''+values[id].replace(',','.'); } } } input.val(update); } 

这个正则表达式

(/(^\d+$)|(^\d+.\d+$)|[,.]/)

应该匹配

  • 每个(^ \ d + $)1111111
  • 或者每个(^ \ d +。\ d + $)111111.11111
  • 或逗号后跟任何字符,它可以在表达式中的任何位置。

我怀疑你的正则表达式应该注意我已经逃脱了最后一段时间。 这将匹配逗号或句点

/(^\d+[,\.]{0,1}\d{3})/

根据评论中的说明,可能正是您想要的

?。?[ – +] [0-9] * \ [0-9] +

也会奏效

注意:您可以使用Roy Osherove的Regulazy或工具Regex Buddy极大地简化您的正则表达式生活。

你想要小数点后面的任意数字位数(逗号或句号)?

出了什么问题:

 /^([1-9][0-9]*|0)([\.,][0-9]+)?$/ 

我为+\.切换了{3} \.[\.,]