使用正则表达式验证2dp十进制值

时间:2018-12-20 14:03:51

标签: jquery regex

到目前为止,我的代码可以正常使用,但是设置了两个小数后我都无法输入任何数字。 知道怎么了吗?

$("input").keypress(function(e) {
  var el = $(this);
  var key = e.keyCode || e.which;
  key = String.fromCharCode(key);
  var value = el.val() + key;
  var regex = /^\d+(,\d{0,2})?$/;
  if (!regex.test(value)) {
    e.returnValue = false;
    if (e.preventDefault) e.preventDefault();
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" value="1234,56">

1 个答案:

答案 0 :(得分:2)

您的代码还将拒绝退格键,删除键和箭头键,这将使用户几乎无法更正已经存在的数字。

我建议不要响应keypress,而应响应input事件,因为它还会触发通过鼠标(在文本中拖动),上下文菜单(清除,粘贴)进行更改的时间。 )或其他输入设备。

区别在于input在进行更改后触发,但这还不错。您可以删除输入中不适合正则表达式的部分:

$("input").on('input', function(e){
    var clean = $(this).val().replace(/^(\d+(,\d{0,2})?)?.*/g, "$1");
    $(this).val(clean);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" value="1234,56">

以上解决方案删除了​​字符违反模式后的其余输入。如果您想保留尽可能多的输入字符,可以执行一个循环,一次只删除一个违规字符:

$("input").on('input', function(e){
    var clean = $(this).val(), input;
    while (input != clean) {
        input = clean;
        clean = input.replace(/^(\d+(,\d{0,2})?)?.?/g, "$1");
    }
    $(this).val(clean);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" value="1234,56">