Quelqu'un sait-il comment vérifier si une variable est un nombre ou une chaîne de caractères en JavaScript ?
Qui indique respectivement "string" et "number".
Quelqu'un sait-il comment vérifier si une variable est un nombre ou une chaîne de caractères en JavaScript ?
Si vous avez affaire à une notation littérale, et non à des constructeurs, vous pouvez utiliser type de :.
typeof "Hello World"; // string
typeof 123; // number
Si vous créez des nombres et des chaînes de caractères à l'aide d'un constructeur, tel que var foo = new String("foo")
Vous devez garder à l'esprit que typeof
peut revenir object
para foo
.
Une méthode plus sûre pour vérifier le type serait peut-être d'utiliser la méthode trouvée dans underscore.js (la source annotée peut être trouvée aquí ),
var toString = Object.prototype.toString;
_.isString = function (obj) {
return toString.call(obj) == '[object String]';
}
Ceci renvoie un booléen true
pour ce qui suit :
_.isString("Jonathan"); // true
_.isString(new String("Jonathan")); // true
Ce n'est pas correct ! Il existe deux représentations possibles d'une chaîne de caractères. alert(typeof new String()) affichera "Object". Pire encore, le javascript effectue parfois des conversions entre les deux représentations dans les coulisses à des fins d'optimisation.
La meilleure façon de le faire est d'utiliser isNaN
+ type de moulage :
Mise à jour de la méthode all-in :
function isNumber(n) { return !isNaN(parseFloat(n)) && !isNaN(n - 0) }
Même chose avec les expressions rationnelles :
function isNumber(n) { return /^-?[\d.]+(?:e-?\d+)?$/.test(n); }
------------------------
isNumber('123'); // true
isNumber('123abc'); // false
isNumber(5); // true
isNumber('q345'); // false
isNumber(null); // false
isNumber(undefined); // false
isNumber(false); // false
isNumber(' '); // false
Cela semble être une bonne solution si vous voulez compter les chaînes de caractères qui sont interprétées comme des nombres valides.
Cette méthode est idéale pour traiter les données lorsque vous n'avez pas de contrôle direct sur la manière dont elles sont envoyées. J'utilise un flux qui m'envoie des nombres sous forme de chaînes de caractères et c'est exactement ce dont j'ai besoin pour détecter les valeurs numériques. Je vous remercie de votre attention.
La meilleure façon que j'ai trouvée est de vérifier la présence d'une méthode sur la chaîne, par exemple :
if (x.substring) {
// do string thing
} else{
// do other thing
}
ou si vous voulez faire quelque chose avec le nombre, vérifiez la propriété du nombre,
if (x.toFixed) {
// do number thing
} else {
// do other thing
}
C'est un peu comme le "duck typing", c'est à vous de voir ce qui est le plus logique. Je n'ai pas assez de karma pour commenter, mais typeof échoue pour les chaînes de caractères et les nombres encadrés, c'est-à-dire :
alert(typeof new String('Hello World'));
alert(typeof new Number(5));
alertera "objet".
Je trouve que c'est mieux que typeof
car il peut toujours tester une chaîne de caractères, qu'il s'agisse d'un objet primitif ou d'une chaîne de caractères. Il suffit de tester une méthode unique pour le type souhaité.
Du point de vue de quelqu'un qui doit maintenir le code, le choix de cette voie peut être déroutant. "Pourquoi ont-ils utilisé substring et n'ont pas transmis de valeurs ? Quelle logique d'entreprise me manque-t-il ici ?" À tout le moins, cette question doit être accompagnée d'un commentaire expliquant la logique en question.
@Lemmings19 Il n'appelle pas réellement la méthode substring, il vérifie seulement si x a une méthode substring.
Vous recherchez isNaN()
:
console.log(!isNaN(123));
console.log(!isNaN(-1.23));
console.log(!isNaN(5-2));
console.log(!isNaN(0));
console.log(!isNaN("0"));
console.log(!isNaN("2"));
console.log(!isNaN("Hello"));
console.log(!isNaN("2005/12/12"));
Voir Fonction JavaScript isNaN() à MDN.
Je trouve étrange qu'ils aient choisi l'opération inverse pour le nom de la méthode. Il semble plus intuitif d'appeler isNumber().
Il ne s'agit pas d'une opération inverse de "isNumber". NaN est une valeur spéciale de nombre en javascript. isNaN convertit tout ce qui lui est fourni en nombre et vérifie si le résultat est NaN ou non. Pour des chaînes de caractères comme "25", vous obtenez un résultat incorrect.
Vérifie si la valeur est une chaîne littérale ou un objet de type chaîne :
function isString(o) {
return typeof o == "string" || (typeof o == "object" && o.constructor === String);
}
Test unitaire :
function assertTrue(value, message) {
if (!value) {
alert("Assertion error: " + message);
}
}
function assertFalse(value, message)
{
assertTrue(!value, message);
}
assertTrue(isString("string literal"), "number literal");
assertTrue(isString(new String("String object")), "String object");
assertFalse(isString(1), "number literal");
assertFalse(isString(true), "boolean literal");
assertFalse(isString({}), "object");
La vérification d'un numéro est similaire :
function isNumber(o) {
return typeof o == "number" || (typeof o == "object" && o.constructor === Number);
}
J'ai adoré cette solution. Pour éviter l'exception pour le cas null, utilisez o["constructor"] au lieu de o.constructor
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.
0 votes
stackoverflow.com/questions/18082/