【问题标题】:Help to improve this javascript input mask帮助改进这个 javascript 输入掩码
【发布时间】:2011-02-25 17:35:58
【问题描述】:

特点

  • 只有数字
  • 独特的点 (.)

但是...我需要改进以允许用户数字点后只有两个数字

有效例子:

  • 121213
  • 123450.10
  • 12345678910111213.39

当前代码(改编自this不需要保持完全相同的代码...):

<HTML>
   <HEAD>
   <SCRIPT language=Javascript>
      <!--
      function isNumberKey(evt,obj){

         var containsDot = obj.value.indexOf(".");

         var charCode = (evt.which) ? evt.which : event.keyCode
         if (charCode > 31 && (charCode < 48 || charCode > 57)){
              if(charCode == 46 && containsDot < 0){
                return true;
              }
                return false;
         }
         return true;
      }
      //-->
   </SCRIPT>
   </HEAD>
   <BODY>
      <INPUT id="txtChar" onkeypress="return isNumberKey(event,this)" type="text" name="txtChar">
   </BODY>
</HTML>

【问题讨论】:

    标签: javascript regex events input mask


    【解决方案1】:

    只需使用正则表达式。例如

    function isNumberKey(evt, obj){
        return obj.value.match(/[0-9]*(\.[0-9]{0,2})?/)
    }
    

    【讨论】:

    • 我认为这将匹配 99.99.3 ,仅供参考。
    • @rlb.usa 这是故意的,否则当您尝试键入一个点时,您的字符将不会被接受,因为返回 false。 @celsown 它可能需要一些调整,看看 JavaScript 正则表达式。
    • 他的函数确定是否应该接受下一个按下的键。发生这种情况时,我认为键还没有在 obj.value 中,因此您的代码实际上是在说在例如之后添加一个额外的字符(任何字符)。 25.67 没问题,因为它会评估为真。
    【解决方案2】:

    我在这里发布了一个完整的工作版本:http://jsfiddle.net/georgecalm/NRtVs/2/

    HTML:

    <input id="txt" type="text" name="txtChar" />
    

    JS:

    var isStrValid = function(str) {
      return ((str.match(/[^\d^.]/) === null) 
           && (str.replace(/\d+\.?\d?\d?/, "") === ""));
    };
    
    var node = dojo.byId("txt");
    dojo.connect(node, "onkeyup", function() {
        if (!isStrValid(node.value)) {
          node.value = node.value.substring(0, node.value.length-1);
        }
    });
    

    第一次检查(isStrValid)确保除了数字和点之外什么都没有。第二个检查模式。

    【讨论】:

    • 我尝试使用警报“调试”您的代码并使用 111.1 返回“false”
    • @celsowm 对。您要求“点后只允许两个数字”。这就是上面的正则表达式所期望的。 “111.1”在点之后只有一个数字。你想要:最多两个,但在点后最少一个数字?
    • 但实际上在“keypress”中使用您的代码,用户无法数字 111.11
    • @celsowm 我认为这取决于您如何实现它。如果这是一个验证器,那么它应该抱怨所有不好的情况。 (看看更新的答案)。
    • 红黑也很酷!但我需要一个“面具”,防止用户输入错误的内容
    【解决方案3】:

    如果它有一个点,但后面没有两位数,则返回false。

    if(containsDot && obj.value.split(".")[1].length != 2){
      return false; 
    }
    

    【讨论】:

      【解决方案4】:

      你可以用

      开始这个函数
      if (obj.value.match(/\.[0-9][0-9]/)) {
          // Already has two decimals
          return false;
      }
      

      【讨论】:

      • 啊,好的。是的,我想有些字符你必须始终允许,在进行上述检查之前为它们返回 true。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      • 1970-01-01
      相关资源
      最近更新 更多