77 votes

JavaScript - Test pour un nombre entier

J'ai un champ de texte qui permet à un utilisateur d'entrer son âge. J'essaie d'effectuer une validation côté client sur ce champ avec JavaScript. La validation côté serveur est déjà en place. Cependant, je ne parviens pas à vérifier que l'utilisateur saisit un nombre entier réel. J'essaie actuellement d'utiliser le code suivant :

    function IsValidAge(value) {
        if (value.length == 0) {
            return false;
        }

        var intValue = parseInt(value);
        if (intValue == Number.NaN) {
            return false;
        }

        if (intValue <= 0)
        {
            return false;
        }
        return true;
    }

Ce qui est étrange, c'est que j'ai saisi des caractères individuels dans la zone de texte, comme "b", et que cette méthode renvoie vrai. Comment puis-je m'assurer que l'utilisateur saisit uniquement un nombre entier ?

Merci.

131voto

karim79 Points 178055
var intRegex = /^\d+$/;
if(intRegex.test(someNumber)) {
   alert('I am an int');
   ...
}

Cela échouera absolument, positivement, si l'utilisateur entre autre chose qu'un nombre entier non négatif.

31voto

Paul Points 3828

Pour une véritable vérification des int, utilisez ceci :

function isInt(value) { 
    return !isNaN(parseInt(value,10)) && (parseFloat(value,10) == parseInt(value,10)); 
}

Le problème avec de nombreux contrôles d'int est qu'ils renvoient 'false' pour 1.0, qui est un entier valide. Cette méthode vérifie que la valeur de l'analyse des flottants et des int est égale, donc pour #.00, elle renvoie true.

UPDATE :

Deux questions ont été abordées dans les commentaires ; je vais ajouter à la réponse pour les futurs lecteurs :

  • Tout d'abord, lors de l'analyse syntaxique des valeurs de chaîne qui utilisent une virgule pour indiquer la décimale, cette méthode ne fonctionne pas. (Ce n'est pas surprenant, comment le pourrait-elle ? Étant donné "1 001" par exemple, aux États-Unis, il s'agit d'un nombre entier alors qu'en Allemagne, ce n'est pas le cas).
  • Deuxièmement, le comportement de parseFloat et parseInt a changé dans certains navigateurs depuis que cette réponse a été écrite et varie selon le navigateur. ParseInt est plus agressif et écarte les lettres apparaissant dans une chaîne. C'est très bien pour obtenir un nombre, mais moins bien pour la validation.

Je recommande et pratique l'utilisation d'une bibliothèque comme Globalize.js pour analyser les valeurs numériques pour/à partir de l'interface utilisateur plutôt que de l'implémentation du navigateur et pour utiliser les appels natifs uniquement pour les valeurs connues fournies par le programme, telles qu'une chaîne analysée à partir d'un document XML.

13voto

Jumipo Points 206

Utiliser isNaN(n)

c'est-à-dire

if(isNaN(intValue))

à la place de

if (intValue == Number.NaN)

8voto

Timbergus Points 444

UPDATE

J'ai corrigé le code qui avait une erreur et ajouté une variable appelée clé pour enregistrer le code de la touche enfoncée en utilisant keyCode y dont qui dépendent du navigateur.

var key = e.which || e.keyCode;

Merci Donald.McLean :)


Si vous voulez vérifier si vous écrivez des chiffres en tapant (et éviter d'écrire d'autres caractères dans votre champ de saisie), vous pouvez utiliser cette fonction simple et vous pouvez définir les éléments autorisés (cela inclut tout ce que vous voulez filtrer). De cette façon, vous pouvez choisir non seulement des nombres entiers, mais par exemple un certain groupe de caractères. L'exemple est basé sur jQuery pour l'attacher à un champ de saisie.

$('#myInputField').keypress(function(e)
{
    var key = e.which || e.keyCode;

    if (!(key >= 48 && key <= 57) && // Interval of values (0-9)
         (key !== 8) &&              // Backspace
         (key !== 9) &&              // Horizontal tab
         (key !== 37) &&             // Percentage
         (key !== 39) &&             // Single quotes (')
         (key !== 46))               // Dot
    {
        e.preventDefault();
        return false;
    }
});

Si vous utilisez une autre clé que celle définie, elle n'apparaîtra pas dans le champ. Et parce qu'Angular.js devient fort ces jours-ci, voici la directive que vous pouvez créer pour faire cela dans n'importe quel champ de votre application web :

myApp.directive('integer', function()
{
    return function (scope, element, attrs)
    {
        element.bind('keydown', function(e)
        {
            var key = e.which || e.keyCode;

            if (!(key >= 48 && key <= 57) && // Interval (0-9)
                 (key !== 8) &&              // Backspace
                 (key !== 9) &&              // Horizontal tab
                 (key !== 37) &&             // Percentage
                 (key !== 39) &&             // Single quotes (')
                 (key !== 46))               // Dot
            {
                e.preventDefault();
                return false;
            }
        });
    }
});

Mais que se passe-t-il si vous voulez utiliser ng-repeat et vous devez appliquer cette directive uniquement dans un certain nombre de domaines. Eh bien, vous pouvez transformer la directive supérieure en une directive prête à admettre une vrai o faux afin de pouvoir décider quel champ sera affecté par elle.

myApp.directive('rsInteger', function() {
    return {
        restrict: 'A',
        link: function (scope, element, attrs) {
            if (attrs.rsInteger === 'true') {
                element.bind('keydown', function(e)
                {
                    var key = e.which || e.keyCode;

                    if (!(key >= 48 && key <= 57) && // Interval (0-9)
                         (key !== 8) &&              // Backspace
                         (key !== 9) &&              // Horizontal tab
                         (key !== 37) &&             // Percentage
                         (key !== 39) &&             // Single quotes (')
                         (key !== 46))               // Dot
                    {
                        e.preventDefault();
                        return false;
                    }
                });
            }
        }
    }
});

Pour utiliser cette nouvelle directive, il suffit de le faire dans un texte de type input comme ceci, par exemple :

<input type="text" rs-integer="true">

J'espère que cela vous aidera.

4voto

Kshitiz Points 199

J'ai fait cela pour vérifier les valeurs numériques et entières.

if(isNaN(field_value * 1) || (field_value % 1) != 0 ) not integer;
else integer;

Division modulaire

Exemple
1. 25.5 % 1 != 0 et ,
2. 25 % 1 == 0

Et if(field_value * 1) NaN si chaîne de caractères ex : 25,34 ou abcd etc ... sinon integer ou nombre

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X