限制输入到文本框:仅允许数字和小数点

Tin*_*Tin 97 html javascript

如何限制输入到文本框,以便它只接受数字和小数点?

小智 153

<HTML>
  <HEAD>
    <SCRIPT language=Javascript>
       <!--
       function isNumberKey(evt)
       {
          var charCode = (evt.which) ? evt.which : evt.keyCode;
          if (charCode != 46 && charCode > 31 
            && (charCode < 48 || charCode > 57))
             return false;

          return true;
       }
       //-->
    </SCRIPT>
  </HEAD>
  <BODY>
    <INPUT id="txtChar" onkeypress="return isNumberKey(event)" 
           type="text" name="txtChar">
  </BODY>
</HTML>
Run Code Online (Sandbox Code Playgroud)

这确实有效!

  • 包括小键盘numkeys和时期具有:!`&&则charCode = 190 &&则charCode = 110 &&(则charCode> 105 ||则charCode <96)` (10认同)
  • if(charCode == 46 && evt.srcElement.value.split('.').length> 1){return false; 这将是多个'.'... :)的privent (9认同)
  • 字符31是单位分隔符代码.相当多的数字和文字介于32和更高之间.代码读取如果输入的字符代码不是十进制并且高于31(单位分隔符)但低于48(数字零)或高于57(数字9),请不要接受它. (2认同)
  • 我可以在此字段中粘贴非数字字符,是否有任何解决方法/ (2认同)

tau*_*tau 24

form.onsubmit = function(){
    return textarea.value.match(/^\d+(\.\d+)?$/);
}
Run Code Online (Sandbox Code Playgroud)

这是你在找什么?

我希望它有所帮助.

编辑:我编辑了上面的例子,以便只有一个句号,前面至少有一个数字,后面跟着至少一个数字.

  • 试试^\d +(\.\ d +)?$ (2认同)

Has*_*dad 23

已接受的解决方案尚未完成,因为您可以输入多个'.',例如24 .... 22..22.通过一些小的修改,它将按预期工作:

<html>

<head>
  <script type="text/javascript">
    function isNumberKey(txt, evt) {
      var charCode = (evt.which) ? evt.which : evt.keyCode;
      if (charCode == 46) {
        //Check if the text already contains the . character
        if (txt.value.indexOf('.') === -1) {
          return true;
        } else {
          return false;
        }
      } else {
        if (charCode > 31 &&
          (charCode < 48 || charCode > 57))
          return false;
      }
      return true;
    }
  </script>
</head>

<body>
  <input type="text" onkeypress="return isNumberKey(this, event);" />
</body>

</html>
Run Code Online (Sandbox Code Playgroud)

  • 唯一的问题是您可以在文本中复制粘贴。添加到输入元素 `ondrop="return false;" onpaste =“返回错误;” oncontextmenu="return false;"` 似乎就足够了 (3认同)

Kur*_*nai 16

这是另一种允许十进制数的解决方案,并且还将十进制后的数字限制为2位小数.

function isNumberKey(evt, element) {
  var charCode = (evt.which) ? evt.which : event.keyCode
  if (charCode > 31 && (charCode < 48 || charCode > 57) && !(charCode == 46 || charCode == 8))
    return false;
  else {
    var len = $(element).val().length;
    var index = $(element).val().indexOf('.');
    if (index > 0 && charCode == 46) {
      return false;
    }
    if (index > 0) {
      var CharAfterdot = (len + 1) - index;
      if (CharAfterdot > 3) {
        return false;
      }
    }

  }
  return true;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="number" id="rate" placeholder="Billing Rate" required onkeypress="return isNumberKey(event,this)">
Run Code Online (Sandbox Code Playgroud)


Hub*_*iak 7

此处介绍的所有解决方案均使用单键事件.这非常容易出错,因为输入也可以使用copy'n'paste或drag'n'drop来给出.也有一些解决方案的限制非字符键,如使用ctrl+c,Pos1等等.

我建议您不要检查每个按键,而是检查结果是否对您的期望有效.

var validNumber = new RegExp(/^\d*\.?\d*$/);
var lastValid = document.getElementById("test1").value;
function validateNumber(elem) {
  if (validNumber.test(elem.value)) {
    lastValid = elem.value;
  } else {
    elem.value = lastValid;
  }
}
Run Code Online (Sandbox Code Playgroud)
<textarea id="test1" oninput="validateNumber(this);" ></textarea>
Run Code Online (Sandbox Code Playgroud)

oninput在文本区域中更改某些内容之后以及在呈现之前触发该事件.

您可以将RegEx扩展为您想要接受的任何数字格式.这比检查单键按压更加可维护和可扩展.