JQuery allow only two numbers after decimal point

前端 未结 7 912
春和景丽
春和景丽 2020-12-02 10:31

I found the following JQuery function here which prevents a user from entering anything that\'s not a number or a single decimal. The function works well but I\'d like to i

相关标签:
7条回答
  • 2020-12-02 11:08

    Try this

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

    Worked Link demo

    0 讨论(0)
  • 2020-12-02 11:10

    It can also be done with a regular expression:

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

    Name the css selector .class to whatever you like and put it on the input.

    0 讨论(0)
  • 2020-12-02 11:12

    The logic is every time a user entering a number you have to check two things.

    1. Has the user entered decimal point?
    2. Are the decimal places more than two?

    For the first one you can use $(this).val().indexOf('.') != -1

    For the second one you can use $(this).val().substring($(this).val().indexOf('.'), $(this).val().indexOf('.').length).length > 2

    EDIT-1
    Also, you have to add event.which != 0 && event.which != 8 so that arrow keys and backspace work in Firefox (Manoj comment)

    EDIT-2
    Also, you have to add $(this)[0].selectionStart >= text.length - 2 so that you can add digits if the cursor is to the left of the decimal point (BIdesi comment)

    EDIT-3
    Also, you have to check if user deleted . and placed it somewhere else creating a value with more than 2 digits after the decimal. So you have to add $this.val($this.val().substring(0, $this.val().indexOf('.') + 3)); for cutting extra digits (Gilberto Sánchez comment)

    EDIT-4
    To handle pasted data, you must bind a paste event handler.Then you have to check if pasted data have . withtext.indexOf('.') > -1 and more than 2 digits after the decimal with text.substring(text.indexOf('.')).length > 3. If so, you have to cut extra digits. Also you have to check that user entered numeric input with $.isNumeric() (darasd comment).

    Here is the code:

    $('.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" />

    0 讨论(0)
  • 2020-12-02 11:17

    thank you! I have added the possibility of deleting the numbers and '.' once typed:

    The event.keyCode !== 8 does that action for backspace.

    The event.keyCode !== 46 does that action for delete.

    $( 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();
            }
        }
      });
    });
    
    0 讨论(0)
  • 2020-12-02 11:20

    I have updated this routine to allow standard editing features as these were prevented in the above code. (This routine is just for processing a float but can be adapted to allow only 2 digits after the decimal)

    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();
    }
    
    0 讨论(0)
  • 2020-12-02 11:27

    I've updated the function for a few extra cases.

    1. It will allow negative numbers
    2. It will allow you to edit the left of the decimal when there are already 2 digits to the right
    3. It allows you to use the arrow keys and backspace when you are in Firefox
    4. It also handles pasted data

    /**
     * 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" />

    0 讨论(0)
提交回复
热议问题