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" comme incluant 0, même s'il 0n'est pas positif. J'inclus des notes si vous voulez interdire 0.
Basé sur l'analyse
Si vous voulez que ce soit une chaîne entière décimale normalisée sur une plage raisonnable de valeurs, vous pouvez le faire:
function isNormalInteger(str) {
var n = Math.floor(Number(str));
return n !== Infinity && String(n) === str && n >= 0;
}
ou si vous souhaitez autoriser les espaces et les zéros non significatifs:
function isNormalInteger(str) {
str = str.trim();
if (!str) {
return false;
}
str = str.replace(/^0+/, "") || "0";
var n = Math.floor(Number(str));
return n !== Infinity && String(n) === str && n >= 0;
}
Banc d'essai en direct (sans gérer les zéros ou les espaces):
function isNormalInteger(str) {
var n = Math.floor(Number(str));
return n !== Infinity && String(n) === str && n >= 0;
}
function gid(id) {
return document.getElementById(id);
}
function test(str, expect) {
var result = isNormalInteger(str);
console.log(
str + ": " +
(result ? "Yes" : "No") +
(expect === undefined ? "" : !!expect === !!result ? " <= OK" : " <= ERROR ***")
);
}
gid("btn").addEventListener(
"click",
function() {
test(gid("text").value);
},
false
);
test("1", true);
test("1.23", false);
test("1234567890123", true);
test("1234567890123.1", false);
test("0123", false); // false because we don't handle leading 0s
test(" 123 ", false); // false because we don't handle whitespace
<label>
String:
<input id="text" type="text" value="">
<label>
<input id="btn" type="button" value="Check">
Banc d'essai en direct ( avec gestion des zéros et des espaces):
function isNormalInteger(str) {
str = str.trim();
if (!str) {
return false;
}
str = str.replace(/^0+/, "") || "0";
var n = Math.floor(Number(str));
return String(n) === str && n >= 0;
}
function gid(id) {
return document.getElementById(id);
}
function test(str, expect) {
var result = isNormalInteger(str);
console.log(
str + ": " +
(result ? "Yes" : "No") +
(expect === undefined ? "" : !!expect === !!result ? " <= OK" : " <= ERROR ***")
);
}
gid("btn").addEventListener(
"click",
function() {
test(gid("text").value);
},
false
);
test("1", true);
test("1.23", false);
test("1234567890123", true);
test("1234567890123.1", false);
test("0123", true);
test(" 123 ", true);
<label>
String:
<input id="text" type="text" value="">
<label>
<input id="btn" type="button" value="Check">
Si vous souhaitez refuser 0, passez simplement >= 0à > 0. (Ou, dans la version qui autorise les zéros non significatifs, supprimez le || "0"sur la replaceligne.)
Comment ça marche:
Dans la version autorisant les espaces et les zéros non significatifs:
str = str.trim(); supprime tout espace blanc de début et de fin.
if (!str) attrape une chaîne vide et retourne, inutile de faire le reste du travail.
str = str.replace(/^0+/, "") || "0"; supprime tous les 0 de tête de la chaîne - mais si cela se traduit par une chaîne vide, restaure un seul 0.
Number(str): Convertir stren un nombre; le nombre peut bien avoir une partie fractionnaire, ou peut l'être NaN.
Math.floor: Tronque le nombre (coupe toute portion fractionnée).
String(...): Reconvertit le résultat en une chaîne décimale normale. Pour les très gros nombres, cela ira à la notation scientifique, ce qui peut briser cette approche. (Je ne sais pas exactement où se trouve la division, les détails sont dans la spécification , mais pour les nombres entiers, je pense que c'est au point où vous avez dépassé 21 chiffres [date à laquelle le nombre est devenu très imprécis, comme IEEE-754 les nombres à double précision ont approximativement 15 chiffres de précision ..)
... === str: Compare cela à la chaîne d'origine.
n >= 0: Vérifiez que c'est positif.
Notez que cela échoue pour l'entrée "+1", toute entrée en notation scientifique qui ne redevient pas la même notation scientifique à l' String(...)étape, et pour toute valeur que le type de nombre JavaScript utilise (virgule flottante binaire double précision IEEE-754) ne peut pas représenter avec précision quelle analyse est plus proche d'une valeur différente de celle donnée (qui comprend de nombreux entiers supérieurs à 9 007 199 254 740 992; par exemple, 1234567890123456789échouera). Le premier est une solution facile, les deux derniers moins.
Expression régulière
L'autre approche consiste à tester les caractères de la chaîne via une expression régulière, si votre objectif est de permettre (disons) simplement une option +suivie de l'une 0ou de l' autre ou d'une chaîne au format décimal normal:
function isNormalInteger(str) {
return /^\+?(0|[1-9]\d*)$/.test(str);
}
Banc d'essai en direct:
function isNormalInteger(str) {
return /^\+?(0|[1-9]\d*)$/.test(str);
}
function gid(id) {
return document.getElementById(id);
}
function test(str, expect) {
var result = isNormalInteger(str);
console.log(
str + ": " +
(result ? "Yes" : "No") +
(expect === undefined ? "" : !!expect === !!result ? " <= OK" : " <= ERROR ***")
);
}
gid("btn").addEventListener(
"click",
function() {
test(gid("text").value);
},
false
);
test("1", true);
test("1.23", false);
test("1234567890123", true);
test("1234567890123.1", false);
test("0123", false); // false because we don't handle leading 0s
test(" 123 ", false); // false because we don't handle whitespace
<label>
String:
<input id="text" type="text" value="">
<label>
<input id="btn" type="button" value="Check">
Comment ça marche:
^: Correspond au début de la chaîne
\+?: Autoriser une seule option +(supprimez-la si vous ne le souhaitez pas)
(?:...|...): Autorisez l'une de ces deux options (sans créer de groupe de capture):
(0|...): Autoriser 0seul ...
(...|[1-9]\d*): ... ou un nombre commençant par autre chose que 0et suivi d'un nombre quelconque de chiffres décimaux.
$: Correspond à la fin de la chaîne.
Si vous voulez interdire 0(car ce n'est pas positif), l'expression régulière devient juste /^\+?[1-9]\d*$/(par exemple, nous pouvons perdre l'alternance que nous devions autoriser 0).
Si vous souhaitez autoriser les zéros non significatifs (0123, 00524), remplacez simplement l'alternance (?:0|[1-9]\d*)par\d+
function isNormalInteger(str) {
return /^\+?\d+$/.test(str);
}
Si vous souhaitez autoriser les espaces, ajoutez \s*juste après ^et \s*juste avant $.
Remarque lorsque vous convertissez cela en nombre: sur les moteurs modernes, il serait probablement bien de l'utiliser +strou Number(str)de le faire, mais les anciens peuvent étendre ceux-ci d'une manière non standard (mais autrefois autorisée) qui dit qu'un zéro de tête signifie octal (base 8), par exemple "010" => 8. Une fois que vous avez validé le nombre, vous pouvez l'utiliser en toute sécurité parseInt(str, 10)pour vous assurer qu'il est analysé en décimal (base 10). parseIntignorerait les ordures à la fin de la chaîne, mais nous nous sommes assurés qu'il n'y en a pas avec l'expression régulière.