Validez qu'une chaîne est un entier positif

Je voudrais que le test de sécurité le plus simple vérifie qu'une chaîne JavaScript est un entier positif.

isNaN(str) renvoie true pour toutes sortes de valeurs non entières et parseInt(str) renvoie des nombres entiers pour les chaînes flottantes, comme "2.5". Et je ne veux pas devoir utiliser un plugin jQuery non plus.

Deux réponses pour vous:

  • Basé sur l'analyse

  • Expression régulière

Notez que dans les deux cas, j'ai interprété "nombre entier positif" pour inclure 0 , même si 0 n'est pas positif. J'inclue des notes si vous voulez interdire 0 .

Basé sur l'analyse

Si vous voulez qu'il s'agisse d'une chaîne entière décimale normalisée sur une gamme raisonnable de valeurs, vous pouvez procéder comme suit:

 function isNormalInteger(str) { var n = Math.floor(Number(str)); return String(n) === str && n >= 0; } 

Test de test en direct:

 function isNormalInteger(str) { var n = Math.floor(Number(str)); return String(n) === str && n >= 0; } function gid(id) { return document.getElementById(id); } function test(str, expect) { console.log(str + ": " + (isNormalInteger(str) ? "Yes" : "No")); } gid("btn").addEventListener( "click", function() { test(gid("text").value); }, false ); test("1"); test("1.23"); test("1234567890123"); test("1234567890123.1"); 
 <label> String: <input id="text" type="text" value=""> <label> <input id="btn" type="button" value="Check"> 

Solution 1

Si l'on considère qu'un nombre entier JavaScript est une valeur maximum de 4294967295 (c'est-à-dire Math.pow(2,32)-1 ), la solution courte suivante fonctionnera parfaitement:

 function isPositiveInteger(n) { return n >>> 0 === parseFloat(n); } 

LA DESCRIPTION:

  1. L'opérateur de changement de zéro à droite passe trois choses importantes:
    • Tronque la partie décimale
      • 123.45 >>> 0 === 123
    • Le changement pour les nombres négatifs
      • -1 >>> 0 === 4294967295
    • " MAX_INT " dans la gamme MAX_INT
      • 1e10 >>> 0 === 1410065408
      • 1e7 >>> 0 === 10000000
  2. parseFloat corrige l'analyse des nombres de chaînes (paramètre NaN pour les chaînes non numériques)

ESSAIS:

 "0" : true "23" : true "-10" : false "10.30" : false "-40.1" : false "string" : false "1234567890" : true "129000098131766699.1" : false "-1e7" : false "1e7" : true "1e10" : false "1edf" : false " " : false "" : false 

DEMO: http://jsfiddle.net/5PT4/37/


Solution 2

Une autre façon est bonne pour toutes les valeurs numériques qui sont valides jusqu'à Number.MAX_VALUE , à environ 1.7976931348623157e+308 :

 function isPositiveInteger(n) { return 0 === n % (!isNaN(parseFloat(n)) && 0 <= ~~n); } 

LA DESCRIPTION:

  1. !isNaN(parseFloat(n)) est utilisé pour filtrer les valeurs de chaîne pure , par exemple "" , " " , "string" ;
  2. 0 <= ~~n filtre les valeurs négatives et non "-40.1" , par exemple "-40.1" , "129000098131766699" ;
  3. (!isNaN(parseFloat(n)) && 0 <= ~~n) renvoie true si la valeur est à la fois numérique et positive ;
  4. 0 === n % (...) vérifie si la valeur est non-flottante – ici (...) (voir 3) est évalué comme 0 en cas de false , et comme 1 en cas de true .

ESSAIS:

 "0" : true "23" : true "-10" : false "10.30" : false "-40.1" : false "string" : false "1234567890" : true "129000098131766699.1" : false "-1e10" : false "1e10" : true "1edf" : false " " : false "" : false 

DEMO: http://jsfiddle.net/5UCy4/14/


La version précédente:

 function isPositiveInteger(n) { return n == "0" || ((n | 0) > 0 && n % 1 == 0); } 

DEMO: http://jsfiddle.net/5UCy4/2/

On dirait qu'une expression régulière est le chemin à parcourir:

 var isInt = /^\+?\d+$/.test('the string'); 

C'est presque une question en double pour celle-ci:

Valider les nombres décimaux en JavaScript – IsNumeric ()

La réponse est:

 function isNumber(n) { return !isNaN(parseFloat(n)) && isFinite(n); } 

Ainsi, un nombre entier positif serait:

 function isPositiveInteger(n) { var floatN = parseFloat(n); return !isNaN(floatN) && isFinite(n) && floatN > 0 && floatN % 1 == 0; } 
 return ((parseInt(str, 10).toString() == str) && str.indexOf('-') === -1); 

Ne fonctionnera pas si vous donnez une chaîne comme '0001'

(~~a == a)a est la chaîne.

Ma fonction vérifie si le nombre est + ve et pourrait également avoir une valeur décimale.

  function validateNumeric(numValue){ var value = parseFloat(numValue); if (!numValue.toString().match(/^[-]?\d*\.?\d*$/)) return false; else if (numValue < 0) { return false; } return true; } 

Juste pour construire sur la réponse de VisioN ci-dessus, si vous utilisez le plugin de validation jQuery, vous pouvez l'utiliser:

 $(document).ready(function() { $.validator.addMethod('integer', function(value, element, param) { return (value >>> 0 === parseFloat(value) && value > 0); }, 'Please enter a non zero integer value!'); } 

Ensuite, vous pouvez utiliser dans vos règles normales définies ou l'ajouter dynamiquement de cette façon:

 $("#positiveIntegerField").rules("add", {required:true, integer:true}); 

Si vous utilisez des formulaires HTML5, vous pouvez utiliser l'attribut min="0" pour l'élément de formulaire <input type="number" /> . Ceci est pris en charge par tous les principaux navigateurs. Cela n'implique pas Javascript pour de telles tâches simples, mais est intégré à la nouvelle norme html. Il est documenté sur https://www.w3schools.com/tags/att_input_min.asp