575 votes

Vérifier si une variable est un nombre ou une chaîne de caractères en JavaScript

Quelqu'un sait-il comment vérifier si une variable est un nombre ou une chaîne de caractères en JavaScript ?

0 votes

504voto

Jonathan Sampson Points 121800

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

72 votes

Qui indique respectivement "string" et "number".

29 votes

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.

3 votes

@George Selon l'OP, seules les variables existantes seront testées.

290voto

BitOfUniverse Points 2516

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

32 votes

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.

3 votes

POUR INFORMATION : null est forcé à 0 et renvoie vrai pour isNumber(null);

0 votes

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.

78voto

Alokito Points 656

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".

2 votes

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é.

0 votes

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.

4 votes

@Lemmings19 Il n'appelle pas réellement la méthode substring, il vérifie seulement si x a une méthode substring.

48voto

Jakob Gade Points 6006

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.

3 votes

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().

12 votes

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.

3 votes

Je viens de tester avec "25" et le résultat est faux, comme je m'y attendais.

28voto

snorbi Points 666

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);
}

1 votes

(o.constructor === String) semble suffisant, même pour les chaînes de caractères.

2 votes

Cela provoquera une exception si o === null

3 votes

J'ai adoré cette solution. Pour éviter l'exception pour le cas null, utilisez o["constructor"] au lieu de o.constructor

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