246 votes

Valider qu’une chaîne est un entier positif

Je voudrais que l’essai de failsafe plus simple, pour vérifier qu’une chaîne en JavaScript est un entier positif.

retourne la valeur true pour toutes sortes de valeurs non entières et entiers pour les chaînes de flotteur, comme « 2,5 » est de retour. Et je ne veux pas avoir à utiliser un plugin jQuery non plus.

354voto

T.J. Crowder Points 285826

Deux réponses pour vous:

  • Basé sur l'analyse

  • Expression régulière

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

Basé sur l'Analyse

Si vous voulez qu'il soit normalisé décimal entier chaîne de caractères sur une certaine plage de valeurs, vous pouvez faire ceci:

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

Vivre banc d'essai | source

Si vous voulez interdire 0, il suffit de changer >= 0 de > 0.

Comment cela fonctionne:

  1. Number(str): Convertir str d'un nombre, le nombre peut très bien avoir une partie fractionnaire, ou peut-être NaN.

  2. ~~: Tronquer le nombre (côtelettes hors de toute partie fractionnaire).

  3. String(...): Convertit le résultat dans un normal chaîne décimale. Pour les très grands nombres, il ira à la notation scientifique, qui peuvent se casser cette approche. (Je ne sais pas trop où la division est, les détails sont dans la spec, mais pour les nombres entiers, je crois que c'est à l'endroit que vous avez dépassé 21 chiffres [date à laquelle le nombre est devenu très imprécise, IEEE-754 double précision numéros seulement ont roughtly une précision de 15 chiffres..)

  4. ... === str: Compare à la chaîne d'origine.

  5. n >= 0: Vérifier que c'est positif.

Notez que cela échoue pour l'entrée "+1" et de l'entrée en notation scientifique qui ne tourne pas dans le même notation scientifique à l' String(...) stade. Le premier est une solution facile, le dernier de ne pas tellement, mais seulement pour les très, très grand nombre.

Expression Régulière

L'autre approche consiste à tester les caractères de la chaîne via une expression régulière, si votre but est simplement de permettre à (dire) facultatif + suivi 0 ou une chaîne normale en format décimal:

function isNormalInteger(str) {
    return /^\+?(0|[1-9]\d*)$/.test(str);
}

Vivre banc d'essai | source

Comment cela fonctionne:

  1. ^: Match de début de chaîne

  2. \+?: Permettre à un seul, facultatif + (à supprimer si vous ne voulez pas)

  3. (?:...|...): Permettre à l'un de ces deux options (sans la création d'un groupe de capture):

    1. (0|...): Autoriser 0 sur son propre...

    2. (...|[1-9]\d*): ...ou un numéro commençant par quelque chose d'autre que 0 et suivie par un certain nombre de chiffres après la virgule.

  4. $: Correspondent à la fin de la chaîne.

Si vous voulez interdire 0 (car il n'est pas positive), l'expression régulière devient juste /^\+?[1-9]\d*$/ (par exemple, nous pouvons perdre de l'alternance que nous avons besoin pour permettre l' 0).

91voto

VisioN Points 62518

Solution 1

Si nous considérons un JavaScript entier pour être une valeur maximale de 4294967295 (c - Math.pow(2,32)-1), puis les suivants à court de solution fonctionne parfaitement:

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

DESCRIPTION:

  1. Zéro de remplissage de décalage à droite de l'opérateur n'trois choses importantes:
    • tronque partie décimale
      • 123.45 >>> 0 === 123
    • le passage pour les nombres négatifs
      • -1 >>> 0 === 4294967295
    • "travaille" dans la gamme d' MAX_INT
      • 1e10 >>> 0 === 1410065408
      • 1e7 >>> 0 === 10000000
  2. parseFloat fait une analyse correcte de la chaîne de chiffres (réglage de l' NaN pour les non chaînes numériques)

TESTS:

"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

DÉMO: http://jsfiddle.net/5UCy4/37/


Solution 2

Un autre moyen est bon pour toutes les valeurs numériques sont valables jusqu'à Number.MAX_VALUE, c'est à dire à environ 1.7976931348623157e+308:

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

DESCRIPTION:

  1. !isNaN(parseFloat(n)) est utilisé pour filtrer pur chaîne de valeurs, par exemple, "", " ", "string";
  2. 0 <= ~~n filtres négatifs et de non-valeurs entières, par exemple, "-40.1", "129000098131766699";
  3. (!isNaN(parseFloat(n)) && 0 <= ~~n) retours true si la valeur est à la fois numérique et positive;
  4. 0 === n % (...) vérifie si la valeur est non-float -- (...) (voir le point 3) est évaluée comme 0 dans le cas d' false, et en tant que 1 dans le cas d' true.

TESTS:

"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

DÉMO: http://jsfiddle.net/5UCy4/14/


La version précédente:

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

DÉMO: http://jsfiddle.net/5UCy4/2/

26voto

Niko Points 16715

Ressemble à une expression régulière est la voie à suivre :

4voto

Chango Points 4245

C’est presque un double question fo celui-ci :

Valider des numéros en JavaScript - IsNumeric()

Sa réponse est :

alors, un entier positif serait :

2voto

Sebas Points 10416
<pre><code></code><p>ne fonctionnera pas si vous donner une chaîne comme "0001" si</p></pre>

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