正则表达式 - 允许数字0-9,Backsapce和1点Javascript

时间:2015-12-08 12:43:24

标签: javascript regex

我有一个作用于keydown事件的函数,我希望它只允许数字,退格和1点。我无法使它发挥作用。这是我试过的:

$('#input[type="number"]').keydown(function(e) {

            this.value = this.value.toLowerCase();
            var regex = new RegExp("^[0-9.,\b]+$");
            var key = String.fromCharCode(!e.charCode ? e.which : e.charCode);
            if (!regex.test(key)) {
                console.log('stop now')
                e.preventDefault();
                return false;
            }
});

它仍然可以防止点,但允许数字。我认为我的正则表达式是错误的,需要调整。

评论消失了,但是有些用户建议它可能与.,的转义有关。有什么想法吗?

6 个答案:

答案 0 :(得分:1)

您可以使用此代替使用正则表达式。我想这会对你有帮助

  
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">  
  <script type="text/javascript" language="jscript">
      function fncInputNumericValuesOnly() {
          if (!(event.keyCode == 32 || event.keyCode == 46 || event.keyCode == 48 || event.keyCode == 49 || event.keyCode == 50 || event.keyCode == 51 || event.keyCode == 52 || event.keyCode == 53 || event.keyCode == 54 || event.keyCode == 55 || event.keyCode == 56 || event.keyCode == 57))
          {
              event.returnValue = false;
          }
      }
</script>
</head>  
<body>  
    <form id="form1" runat="server">  
    <div>  
    <asp:TextBox ID="txtEmpName" onkeypress="fncInputNumericValuesOnly()" runat="server"></asp:TextBox>   
    </div>  
    </form>  

</body>  
</html>  

答案 1 :(得分:0)

使用keypress而不是keydown事件。为keydown事件的某些键发送了不同的字符代码。点是其中之一,发送代码190而不是ASCII 46。你可以玩它here

答案 2 :(得分:0)

派对有点晚了,但这样可行。

编辑:在你downvote之前点击运行代码snippit

&#13;
&#13;
var onlySome = restrictKeys([8,190]) // allow the dot

// decorate the jquery function with some functional goodness
$('input[type="text"]').keydown(onlySome(function(e) {
  stackLog(['key alowed', e.which, String.fromCharCode(e.which)]);
}));

// functional function to partially apply restricted keys and callback functiion
function restrictKeys(keys) {
  return function(fn) {
    return function(e) {
      // all codes between 48 and 57 are number and cool to leave in, then just filter out our array
      if ((e.which < 48 || e.which > 57) && keys.indexOf(e.which) < 0) {
        stackLog(['nope', e.which, String.fromCharCode(e.which)]);
        e.preventDefault();
        return false
      }
      return fn.call(this, e);
    }
  }
}

function stackLog(log) {
  var _console = document.querySelector('#console');
  _console.innerHTML = JSON.stringify(log) + '\n' + _console.innerHTML;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" placeholder="enter text here">
<pre id="console"></pre>
&#13;
&#13;
&#13;

答案 3 :(得分:0)

你有没有试过这样的东西? 当然不是很完美,但你可以把它当作一个起点:

var whitelist = /^\d+\.?\d+?[\b]?$/;

function testInput() {
  var val = document.getElementById('val').value;
  var res = document.getElementById('res');
  
  if(whitelist.test(val)) {
     res.innerText = 'YEP';
  } else {
     res.innerText = 'NOOPE';
  }  
}
<input onchange="testInput()" type="text" id="val"/>

<h1 id="res"></h1>

答案 4 :(得分:0)

我的回答有点晚了,但在这里我已经将代码更改为可能适合您的代码:

var valid_value = '';
$('#input[type="number"]').keyup(function(e) {
        var regex = new RegExp(/^[0-9]*\.?[0-9]*$/);
        if (!regex.test(this.value)) {
            this.value = valid_value;
            console.log('stop now');
        } else {
            valid_value = this.value;
        }
});

答案 5 :(得分:0)

这就是我最终想出来的。一个小手册,但诀窍!

$('#input[type="number"]').keydown(function(e) {

         if (!(e.keyCode == 190 || e.keyCode == 8 || e.keyCode == 9 || e.keyCode == 13 || e.keyCode == 32 || e.keyCode == 46 || e.keyCode == 48 || e.keyCode == 49 || e.keyCode == 50 || e.keyCode == 51 || e.keyCode == 52 || e.keyCode == 53 || e.keyCode == 54 || e.keyCode == 55 || e.keyCode == 56 || e.keyCode == 57)) {
                e.returnValue = false;
                e.preventDefault();
                return false;
            }
});