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

IT技术 javascript html
2021-02-10 01:57:24

如何限制文本框的输入,使其只接受数字和小数点?

6个回答

<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>

这真的有效!

包括键盘数字键和句点: && charCode != 190 && charCode != 110 && (charCode > 105 || charCode < 96)
2021-03-23 01:57:24
if (charCode == 46 && evt.srcElement.value.split('.').length>1) { return false; 它将保护多个 '.'... :)
2021-03-27 01:57:24
我可以在此字段中粘贴非数字字符,是否有任何解决方法/
2021-04-11 01:57:24
为什么需要 && charCode >31?
2021-04-12 01:57:24
字符 31 是单位分隔符代码。几乎所有数字和文本都在 32 和更高之间。代码读取如果输入的字符代码不是小数且大于 31(单位分隔符)但小于 48(数字零)或大于 57(数字九),则不接受。
2021-04-12 01:57:24

接受的解决方案并不完整,因为您可以输入多个“.”,例如 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>

唯一的问题是您可以复制粘贴文本。添加到输入元素ondrop="return false;" onpaste="return false;" oncontextmenu="return false;"似乎就足够了
2021-03-16 01:57:24
我使用了你的答案,但我修改了这个 onkeypress="return isNumberKey(this,event);"
2021-03-19 01:57:24
为我们节省了几个按键……tq
2021-03-24 01:57:24
阻止他们使用拖放或复制粘贴对每个用户来说都是一种错误的服务。
2021-04-02 01:57:24
是的,我认为输入传递事件是可选的,因为它适用于两种情况,谢谢
2021-04-06 01:57:24
form.onsubmit = function(){
    return textarea.value.match(/^\d+(\.\d+)?$/);
}

这是你要找的吗?

我希望它有帮助。

编辑:我编辑了上面的示例,以便只能有一个句点,前面至少有一位数字,后面至少有一位数字。

我看到海报已经编辑了他/她的原始问题。感谢更新!
2021-03-24 01:57:24
认为这也将验证 '99.23.65.86' .... 但我想问题是关于用单点验证 '56987.32' .....
2021-04-09 01:57:24
我最好使用 /^\d+([\.,]\d+)?$/ 来支持国际号码(其中使用逗号而不是点)
2021-04-11 01:57:24

这是另一种解决方案,它允许使用十进制数并将小数点后的数字限制为小数点后两位。

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;
}
<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)">

如果您已经放置了 2 个小数点,则此解决方案不允许在左侧输入任何内容,您还必须处理粘贴。
2021-03-24 01:57:24
请注意,当文本粘贴或拖放到字段上时,此解决方案允许使用多个点 ( .)、破折号 ( -) 和字母e默认情况下,HTML 元素还将显示两个箭头,用于在 Chrome 中增加和减少数字。递减按钮允许数字降到零以下。
2021-03-28 01:57:24
几乎完美......你的最后一个条件if是缺少一个大写的“C”。
2021-04-03 01:57:24
漂亮。非常适合我。
2021-04-08 01:57:24
美丽的解决方案!!
2021-04-09 01:57:24

此处介绍的所有解决方案都使用单键事件。这很容易出错,因为也可以使用复制'n'粘贴或拖放'n'drop 来提供输入。还有一些解决方案限制了非字符键的使用,例如ctrl+cPos1等。

我建议不要检查每个按键,而是检查结果是否符合您的期望。

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;
  }
}
<textarea id="test1" oninput="validateNumber(this);" ></textarea>

oninput事件在文本区域中的某些内容发生更改之后和呈现之前被触发。

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

这是最优雅的解决方案!
2021-03-24 01:57:24