【问题标题】:JQuery allow only two numbers after decimal pointJQuery 只允许小数点后两个数字
【发布时间】:2014-02-15 11:25:09
【问题描述】:

我发现以下 JQuery 函数 here 可以防止用户输入任何不是数字或单个小数的内容。该功能运行良好,但我想对其进行改进以防止用户输入 3 个或更多小数位,即禁止 99.999 并允许 99.99。有什么想法吗?

 function checkForInvalidCharacters(event, inputBox){                            
     if ((event.which != 46 || inputBox.val().indexOf('.') != -1) && (event.which < 48 || event.which > 57)) {          
                event.preventDefault();           
            }   
     };

【问题讨论】:

  • 该功能对我来说效果不佳。我可以输入122.33.33.3343。
  • 您好 laaposto,您是否尝试从按键功能调用它? $('#amount').keypress(function(event) { checkForInvalidCharacters(event, $(this)); });

标签: javascript jquery keycode


【解决方案1】:

逻辑是每次用户输入数字时,您必须检查两件事。

  1. 用户输入小数点了吗?
  2. 小数位是否超过两位?

第一个可以使用$(this).val().indexOf('.') != -1

第二个可以使用$(this).val().substring($(this).val().indexOf('.'), $(this).val().indexOf('.').length).length &gt; 2

EDIT-1
此外,您必须添加 event.which != 0 &amp;&amp; event.which != 8 以便箭头键和退格键在 Firefox 中工作(Manoj 评论)

EDIT-2
此外,您必须添加$(this)[0].selectionStart &gt;= text.length - 2,以便在光标位于小数点左侧时添加数字(BIdesi 注释)

EDIT-3
此外,您必须检查用户是否删除了. 并将其放置在其他位置,从而创建了一个小数点后超过 2 位的值。所以你必须添加 $this.val($this.val().substring(0, $this.val().indexOf('.') + 3)); 减少多余的数字(Gilberto Sánchez 评论)

EDIT-4
要处理粘贴的数据,您必须绑定一个粘贴事件处理程序。然后您必须检查粘贴的数据是否有.text.indexOf('.') &gt; -1 以及小数点后两位以上的text.substring(text.indexOf('.')).length &gt; 3。如果是这样,你必须减少额外的数字。您还必须检查用户是否使用$.isNumeric()(darasd 评论)输入了数字输入。

代码如下:

$('.number').keypress(function(event) {
    var $this = $(this);
    if ((event.which != 46 || $this.val().indexOf('.') != -1) &&
       ((event.which < 48 || event.which > 57) &&
       (event.which != 0 && event.which != 8))) {
           event.preventDefault();
    }

    var text = $(this).val();
    if ((event.which == 46) && (text.indexOf('.') == -1)) {
        setTimeout(function() {
            if ($this.val().substring($this.val().indexOf('.')).length > 3) {
                $this.val($this.val().substring(0, $this.val().indexOf('.') + 3));
            }
        }, 1);
    }

    if ((text.indexOf('.') != -1) &&
        (text.substring(text.indexOf('.')).length > 2) &&
        (event.which != 0 && event.which != 8) &&
        ($(this)[0].selectionStart >= text.length - 2)) {
            event.preventDefault();
    }      
});

$('.number').bind("paste", function(e) {
var text = e.originalEvent.clipboardData.getData('Text');
if ($.isNumeric(text)) {
    if ((text.substring(text.indexOf('.')).length > 3) && (text.indexOf('.') > -1)) {
        e.preventDefault();
        $(this).val(text.substring(0, text.indexOf('.') + 3));
   }
}
else {
        e.preventDefault();
     }
});
.number {
  padding: 5px 10px;
  font-size: 16px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" class="number" />

【讨论】:

  • @Manoj 我注意到在 Firefox 中退格不起作用。所以我更新了我的答案。谢谢指出
  • 不适用于场景,输入12.34然后使用箭头键来到'2'的位置并删除它并用其他数字替换它,你不能
  • @BIdesi 好收获!我更新了代码,现在你的场景可以正常工作了。
  • 谢谢,但是如果我删除. 然后我把它放到另一个地方会发生什么?例如,如果我有 22.45,那么我删除小数点并这样写:2.245?
【解决方案2】:

也可以用正则表达式来完成:

    $('.class').on('input', function () {
        this.value = this.value.match(/^\d+\.?\d{0,2}/);
    });

将 css 选择器 .class 命名为您喜欢的任何名称,并将其放在输入中。

【讨论】:

  • 如果我们在数字前只写小数,那么它会删除输入的值。它不应删除输入的值,但不允许在第一个位置输入小数 (.)。
【解决方案3】:

我已经针对一些额外的情况更新了函数。

  1. 它将允许负数
  2. 当右边已经有 2 位数字时,它将允许您编辑小数点的左边
  3. 它允许您在 Firefox 中使用箭头键和退格键
  4. 它还处理粘贴的数据

/**
 * Given an input field, this function will only allow numbers with up to two decimal places to be input.
 * @param {object} element
 * @return {number}
 */
function forceNumber(element) {
  element
    .data("oldValue", '')
    .bind("paste", function(e) {
      var validNumber = /^[-]?\d+(\.\d{1,2})?$/;
      element.data('oldValue', element.val())
      setTimeout(function() {
        if (!validNumber.test(element.val()))
          element.val(element.data('oldValue'));
      }, 0);
    });
  element
    .keypress(function(event) {
      var text = $(this).val();
      if ((event.which != 46 || text.indexOf('.') != -1) && //if the keypress is not a . or there is already a decimal point
        ((event.which < 48 || event.which > 57) && //and you try to enter something that isn't a number
          (event.which != 45 || (element[0].selectionStart != 0 || text.indexOf('-') != -1)) && //and the keypress is not a -, or the cursor is not at the beginning, or there is already a -
          (event.which != 0 && event.which != 8))) { //and the keypress is not a backspace or arrow key (in FF)
        event.preventDefault(); //cancel the keypress
      }

      if ((text.indexOf('.') != -1) && (text.substring(text.indexOf('.')).length > 2) && //if there is a decimal point, and there are more than two digits after the decimal point
        ((element[0].selectionStart - element[0].selectionEnd) == 0) && //and no part of the input is selected
        (element[0].selectionStart >= element.val().length - 2) && //and the cursor is to the right of the decimal point
        (event.which != 45 || (element[0].selectionStart != 0 || text.indexOf('-') != -1)) && //and the keypress is not a -, or the cursor is not at the beginning, or there is already a -
        (event.which != 0 && event.which != 8)) { //and the keypress is not a backspace or arrow key (in FF)
        event.preventDefault(); //cancel the keypress
      }
    });
}

forceNumber($("#myInput"));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="myInput" />

【讨论】:

    【解决方案4】:

    谢谢!我添加了删除数字和“。”的可能性。输入一次:

    event.keyCode !== 8退格 执行该操作。

    event.keyCode !== 46delete 执行该操作。

    $( document ).ready(function() {
    
        $('#Ds_Merchant_Amount').keypress(function(event) {
        if ((event.which != 46 || $(this).val().indexOf('.') != -1) && (event.which < 48 || event.which > 57) ) {
            if (event.keyCode !== 8 && event.keyCode !== 46 ){ //exception
                event.preventDefault();
            }
        }
        if(($(this).val().indexOf('.') != -1) && ($(this).val().substring($(this).val().indexOf('.'),$(this).val().indexOf('.').length).length>2 )){
            if (event.keyCode !== 8 && event.keyCode !== 46 ){ //exception
                event.preventDefault();
            }
        }
      });
    });
    

    【讨论】:

      【解决方案5】:

      带有小数点最多 2 个小数点验证的数值。 依赖 jQuery.

      HTML -

      <span>Float</span>
      <input type="text" name="numeric" class='allownumericwithdecimal'>
      <div>Numeric values only allowed  (With Decimal Point) </div>
      

      JQuery 代码 -

      方法一-

          $(".allownumericwithdecimal").on("keypress keyup blur", function (event) {
           var patt = new RegExp(/[0-9]*[.]{1}[0-9]{2}/i);
           var matchedString = $(this).val().match(patt);
           if (matchedString) {
               $(this).val(matchedString);
           }
           if ((event.which != 46 || $(this).val().indexOf('.') != -1) && (event.which < 48 || event.which > 57)) {
               event.preventDefault();
           }
       });
      

      方法二——

       $(".allownumericwithdecimal").on("keypress keyup blur", function (event) {
           var patt = new RegExp(/(?<=\.\d\d).+/i);
           $(this).val($(this).val().replace(patt, ''));
      
           if ((event.which != 46 || $(this).val().indexOf('.') != -1) && (event.which < 48 || event.which > 57)) {
               event.preventDefault();
           }
       });
      

      【讨论】:

      • 我在一个项目中实现了方法2,但发现它只适用于Chrome。积极的后视在其他浏览器中不起作用(正如我在几个小时后了解到的那样)。方法 1 在我测试的所有四个浏览器中都有效,尽管我使用了: var patt = new RegExp(/^\d+\.\d\d/i);
      【解决方案6】:

      我已更新此例程以允许标准编辑功能,因为这些在上述代码中被阻止。 (此例程仅用于处理浮点数,但可以调整为仅允许小数点后 2 位)

      var value = $(this).val().toString();
      
      // Allowed Keys
      if (event.which === 8 || event.which === 46 // Character delete
          || event.which === 16 || event.which === 17 // Modifier Key
          || event.which === 37 || event.which === 39  // Arrow Keys
          || (event.key.toLowerCase() === "a" && event.ctrlKey) // Select All
          || (event.key.toLowerCase() === "c" && event.ctrlKey) // Copy
          || (event.key.toLowerCase() === "x" && event.ctrlKey) // Cut
          || (event.key.toLowerCase() === "v" && event.ctrlKey) // Paste
          || (event.which === 45 && event.ctrlKey) // Old school copy (CTRL + INSERT)
          || (event.which === 46 && event.shiftKey) // Old school cut (SHIFT + DELETE)
          || (event.which === 45 && event.shiftKey) // Old school paste (SHIFT + INSERT)
          || (event.which === 35) // END
          || (event.which === 36) // HOME
          || (event.which === 35 && event.shiftKey) // SHIFT + END
          || (event.which === 36 && event.shiftKey) // SHIFT + HOME
          )
      {
          return;
      }
      else if (event.which === 190) // Process decimal point
      {
          if (value == "" || value.indexOf(".") > -1)
          {
              event.preventDefault();
          }
      }
      else if (event.which < 48 || event.which > 57 || event.ctrlKey || event.shiftKey) // Reject anything else that isn't a number
      {
          event.preventDefault();
      }
      

      【讨论】:

        【解决方案7】:

        试试这个

        HTML

        <input type="text" id="min_rent" name="min_rent" onkeypress="return isPrice(event,$('#min_rent').val())">
        

        jQuery

        function isPrice(evt,value) {
            var charCode = (evt.which) ? evt.which : event.keyCode;
            if((value.indexOf('.')!=-1) && (charCode != 45 && (charCode < 48 || charCode > 57)))
                return false;
            else if(charCode != 45 && (charCode != 46 || $(this).val().indexOf('.') != -1) && (charCode < 48 || charCode > 57))
                return false;
            return true;
        }
        

        有效链接 demo

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多