JQuery ne permet que deux nombres après la virgule

j'ai trouvé la fonction jQuery suivante ici qui empêche un utilisateur d'entrer quoi que ce soit qui n'est pas un nombre ou une décimale simple. La fonction fonctionne bien, mais je voudrais l'améliorer pour empêcher l'utilisateur d'Entrer 3 ou plus décimales c.-à-d. refuser 99.999 et permettre 99.99. Des idées?

 function checkForInvalidCharacters(event, inputBox){                            
     if ((event.which != 46 || inputBox.val().indexOf('.') != -1) && (event.which < 48 || event.which > 57)) {          
                event.preventDefault();           
            }   
     };
25
demandé sur Community 2014-02-15 15:25:09

7 réponses

la logique est que chaque fois qu'un utilisateur entre un numéro, vous devez vérifier deux choses.

  1. L'Utilisateur a-t-il entré le point décimal?
  2. les décimales sont-elles supérieures à deux?

Pour le premier que vous pouvez utiliser $(this).val().indexOf('.') != -1



Pour le second, vous pouvez utiliser le bouton $(this).val().substring($(this).val().indexOf('.'), $(this).val().indexOf('.').length).length > 2

EDITION 1

Aussi, vous devez ajouter event.which != 0 && event.which != 8 pour que les touches fléchées et le backspace fonctionnent dans Firefox (commentaire Manoj)

EDIT-2

Aussi, vous devez ajouter $(this)[0].selectionStart >= text.length - 2 de sorte que vous pouvez ajouter des chiffres si le curseur est à la gauche du point décimal (commentaire BIdesi)

EDIT-3

Aussi, vous devez vérifier si l'utilisateur supprimé . et l'a placé ailleurs en créant une valeur avec plus de 2 chiffres après la décimale. Donc, vous avez à ajouter $this.val($this.val().substring(0, $this.val().indexOf('.') + 3)); pour la coupe des chiffres supplémentaires (Gilberto Sanchez commentaire)

EDIT-4

Pour gérer les données collées, vous devez lier un gestionnaire d'événement de coller.Ensuite, vous devez vérifier si les données collées ont . avec text.indexOf('.') > -1 et plus de 2 chiffres après la virgule avec text.substring(text.indexOf('.')).length > 3 . Si oui, vous devez couper supplémentaire chiffre. Vous devez également vérifier que l'Utilisateur a entré l'entrée numérique avec $.isNumeric() (commentaire darasd).

voici le 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" />
41
répondu laaposto 2017-05-05 09:02:43

j'ai mis à jour la fonction pour quelques cas supplémentaires.

  1. il permettra des nombres négatifs
  2. il vous permettra d'éditer la gauche de la décimale quand il ya déjà 2 chiffres à la droite
  3. il vous permet d'utiliser les touches fléchées et backspace lorsque vous êtes dans Firefox""
  4. il traite également les données collées

/**
 * 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" />
3
répondu Mike 2015-05-05 19:33:35

cela peut aussi être fait avec une expression régulière:

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

nomme le sélecteur css .la classe pour tout ce que vous voulez et de le mettre sur l'entrée.

3
répondu Tegge 2017-08-18 06:48:44

merci! J'ai ajouté la possibilité de supprimer les numéros et '."une fois tapé:

le event.keyCode !== 8 fait cette action pour backspace .

le event.keyCode !== 46 fait cette action pour supprimer .

$( 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();
        }
    }
  });
});
2
répondu gtamborero 2016-04-26 06:12:35

j'ai mis à jour cette routine pour permettre des fonctionnalités d'édition standard car elles ont été empêchées dans le code ci-dessus. (Cette routine est juste pour traiter un flotteur mais peut être adaptée pour permettre seulement 2 chiffres après la décimale)

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
répondu Dreamwalker 2014-09-12 09:34:27

Essayez cette

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

Lien Travaillé démo

0
répondu Sakthi Karthik 2014-10-29 06:15:48

valeurs numériques avec un point décimal jusqu'à la validation de 2 points décimaux. Dépendance jQuery .

HTML -

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

Code JQuery -

Méthode 1 -

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

Méthode 2 -

 $(".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();
     }
 });
0
répondu Ravindra Vairagi 2018-01-13 13:26:09