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:
Number(str)
: Convertir str
d'un nombre, le nombre peut très bien avoir une partie fractionnaire, ou peut-être NaN
.
~~
: Tronquer le nombre (côtelettes hors de toute partie fractionnaire).
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..)
... === str
: Compare à la chaîne d'origine.
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:
^
: Match de début de chaîne
\+?
: Permettre à un seul, facultatif +
(à supprimer si vous ne voulez pas)
-
(?:...|...)
: Permettre à l'un de ces deux options (sans la création d'un groupe de capture):
(0|...)
: Autoriser 0
sur son propre...
(...|[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.
$
: 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
).