web-dev-qa-db-fra.com

Vérifier si la variable est un nombre ou une chaîne en JavaScript

Est-ce que quelqu'un sait comment puis-je vérifier si une variable est un nombre ou une chaîne en JavaScript?

425
Jin Yong

Si vous utilisez une notation littérale, et non des constructeurs, vous pouvez utiliser typeof :.

typeof "Hello World"; // string
typeof 123;           // number

Si vous créez des nombres et des chaînes via un constructeur, tel que var foo = new String("foo"), gardez à l'esprit que typeof peut renvoyer object pour foo

Une méthode plus fiable pour vérifier le type serait peut-être d'utiliser la méthode décrite dans underscore.js (la source annotée peut être trouvée ici ),

var toString = Object.prototype.toString;

_.isString = function (obj) {
  return toString.call(obj) == '[object String]';
}

Cela retourne une valeur booléenne true pour les éléments suivants:

_.isString("Jonathan"); // true
_.isString(new String("Jonathan")); // true
413
Sampson

La meilleure façon de faire consiste à utiliser le transtypage de type isNaN +:

Méthode all-in mise à jour:

function isNumber(n) { return !isNaN(parseFloat(n)) && !isNaN(n - 0) }

Le même en utilisant regex:

function isNumber(n) { return /^-?[\d.]+(?:e-?\d+)?$/.test(n); } 

------------------------

isNumber ('123'); // true  
isNumber ('123abc'); // true  
isNumber (5); // true  
isNumber ('q345'); // false
isNumber(null); // false
isNumber(undefined); // false
isNumber(false); // false
isNumber('   '); // false
184
BitOfUniverse

Le meilleur moyen que j’ai trouvé est de rechercher une méthode sur la chaîne, c’est-à-dire:

if (x.substring) {
// do string thing
} else{
// do other thing
}

ou si vous voulez faire quelque chose avec le contrôle de numéro pour une propriété de numéro,

if (x.toFixed) {
// do number thing
} else {
// do other thing
}

C'est un peu comme "taper du canard", c'est à vous de choisir le sens le plus logique. Je n'ai pas assez de karma pour commenter, mais le typeof échoue pour les chaînes et les nombres en boîte, c'est-à-dire:

alert(typeof new String('Hello World'));
alert(typeof new Number(5));

va alerter "objet".

73
Alokito

Vérifiez si la valeur est un littéral de chaîne ou un objet String:

function isString(o) {
    return typeof o == "string" || (typeof o == "object" && o.constructor === String);
}

Test de l'unité:

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

Rechercher un numéro est similaire:

function isNumber(o) {
    return typeof o == "number" || (typeof o == "object" && o.constructor === Number);
}
28
snorbi

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 JavaScript isNaN () Function at MDN.

27
Jakob Gade

Depuis ES2015, la méthode correcte pour vérifier si une variable .__ détient un nombre valide est la suivante:

Number.isFinite(value)

Exemples:

Number.isFinite(Infinity)   // false
Number.isFinite(NaN)        // false
Number.isFinite(-Infinity)  // false

Number.isFinite(0)          // true
Number.isFinite(2e64)       // true

Number.isFinite('0')        // false
Number.isFinite(null)       // false
19
adius

Essaye ça,

<script>
var regInteger = /^\d+$/;

function isInteger( str ) {    
    return regInteger.test( str );
}

if(isInteger("1a11")) {
   console.log( 'Integer' );
} else {
   console.log( 'Non Integer' );
}
</script>
17
adatapost
//testing data types accurately in JavaScript (opposed to "typeof")
//from http://bonsaiden.github.com/JavaScript-Garden/
function is(type, obj) {
    var clas = Object.prototype.toString.call(obj).slice(8, -1);
    return obj !== undefined && obj !== null && clas === type;
}

//basic usage
is('String', 'test'); // true
is('Array', true); // false

Ou adaptez-le pour retourner un type inconnu:

function realTypeOf(obj) {
    return Object.prototype.toString.call(obj).slice(8, -1);
}

//usage
realTypeOf(999); // 'Number'

Mise à jour du 12 mai 2012:Exemple complet sur Javascript: Un meilleur type de type .

13
mrrena

Meilleure façon de faire ceci:

function isNumber(num) {
  return (typeof num == 'string' || typeof num == 'number') && !isNaN(num - 0) && num !== '';
};

Cela satisfait les cas de test suivants:

assertEquals("ISNUMBER-True: 0", true, isNumber(0));
assertEquals("ISNUMBER-True: 1", true, isNumber(-1));
assertEquals("ISNUMBER-True: 2", true, isNumber(-500));
assertEquals("ISNUMBER-True: 3", true, isNumber(15000));
assertEquals("ISNUMBER-True: 4", true, isNumber(0.35));
assertEquals("ISNUMBER-True: 5", true, isNumber(-10.35));
assertEquals("ISNUMBER-True: 6", true, isNumber(2.534e25));
assertEquals("ISNUMBER-True: 7", true, isNumber('2.534e25'));
assertEquals("ISNUMBER-True: 8", true, isNumber('52334'));
assertEquals("ISNUMBER-True: 9", true, isNumber('-234'));

assertEquals("ISNUMBER-False: 0", false, isNumber(NaN));
assertEquals("ISNUMBER-False: 1", false, isNumber({}));
assertEquals("ISNUMBER-False: 2", false, isNumber([]));
assertEquals("ISNUMBER-False: 3", false, isNumber(''));
assertEquals("ISNUMBER-False: 4", false, isNumber('one'));
assertEquals("ISNUMBER-False: 5", false, isNumber(true));
assertEquals("ISNUMBER-False: 6", false, isNumber(false));
assertEquals("ISNUMBER-False: 7", false, isNumber());
assertEquals("ISNUMBER-False: 8", false, isNumber(undefined));
assertEquals("ISNUMBER-False: 9", false, isNumber(null));
12
Sitch

Voici une approche basée sur l'idée de contraindre l'entrée à un nombre ou à une chaîne en ajoutant zéro ou la chaîne nulle, puis d'effectuer une comparaison d'égalité typée.

function is_number(x) { return x === x+0;  }
function is_string(x) { return x === x+""; }

Pour certaines raisons insondables, x===x+0 semble mieux fonctionner que x===+x.

Existe-t-il des cas où cela échoue?

Dans la même veine:

function is_boolean(x) { return x === !!x; }

Cela semble être légèrement plus rapide que x===true || x===false ou typeof x==="boolean" (et beaucoup plus rapide que x===Boolean(x)).

Puis il y a aussi 

function is_regexp(x)  { return x === RegExp(x); }

Tout cela dépend de l’existence d’une opération "identité" propre à chaque type, applicable à n’importe quelle valeur et produisant de manière fiable une valeur du type en question. Je ne peux pas penser à une telle opération pour les dates.

Pour NaN, il y a

function is_nan(x) { return x !== x;}

Ceci est fondamentalement la version de underscore, et dans sa version actuelle est environ quatre fois plus rapide que isNaN(), mais les commentaires dans la source de soulignement mentionnent que "NaN est le seul nombre qui ne s'égalise pas" et ajoute un contrôle pour _. isNumber. Pourquoi? Quels autres objets ne seraient pas égaux? De plus, le trait de soulignement utilise x !== +x--, mais quelle différence le + peut-il faire ici?

Alors pour le paranoïaque:

function is_undefined(x) { return x===[][0]; }
8
user663031

Pouvez-vous simplement le diviser par 1?

Je suppose que le problème serait une entrée de chaîne du type: "123ABG"

var Check = "123ABG"

if(Check == Check / 1)
{
alert("This IS a number \n")
}

else
{
alert("This is NOT a number \n")
}

Juste une façon je l'ai fait récemment.

7
Luke

euh, pourquoi pas juste:

function IsString(obj) {
    return obj !== undefined && obj != null && obj.toLowerCase !== undefined;
}

Après un examen approfondi plusieurs mois plus tard, cela garantit uniquement que obj est un objet pour lequel la méthode ou le nom de propriété toLowerCase est défini. J'ai honte de ma réponse. S'il vous plaît voir typeof un voté par le haut.

7
ZagNut

Je pense que convertir la var en chaîne diminue les performances, du moins ce test effectué dans les derniers navigateurs le montre bien.

Donc, si vous vous souciez de la performance, j'aimerais utiliser ceci:

typeof str === "string" || str instanceof String

pour vérifier si la variable est une chaîne (même si vous utilisez var str = new String("foo"), str instanceof String renverrait true).

Pour ce qui est de vérifier s’il s’agit d’un numéro, je choisirais le natif: isNaN; une fonction.

6
Roland

ou utilisez simplement l'invert de isNaN

si (! isNaN (data)) faire quelque chose avec le nombre sinon c'est une ficelle

et oui - en utilisant jQuery - $ .isNumeric () est plus amusant pour l'argent.

5
osomanden

Cette solution résout bon nombre des problèmes soulevés ici!

C'est de loin la méthode la plus fiable que j'ai utilisée de loin. Je n'ai pas inventé cela et je ne me souviens plus où je l'ai trouvé. Mais cela fonctionne là où d'autres techniques échouent:

// Begin public utility /getVarType/
// Returns 'Function', 'Object', 'Array',
// 'String', 'Number', 'Boolean', or 'Undefined'
getVarType = function ( data ){
  if (undefined === data ){ return 'Undefined'; }
  if (data === null ){ return 'Null'; }
  return {}.toString.call(data).slice(8, -1);
};  
// End public utility /getVarType/

Exemple de correction

var str = new String();
console.warn( getVarType(str) ); // Reports "String"    
console.warn( typeof str );      // Reports "object"

var num = new Number();
console.warn( getVarType(num) ); // Reports "Number"
console.warn( typeof num );      // Reports "object"

var list = [];
console.warn( getVarType( list ) ); // Reports "Array"
console.warn( typeof list );        // Reports "object"
4
Michael Mikowski

typeof fonctionne très bien pour moi dans la plupart des cas. Vous pouvez essayer d'utiliser une instruction if

if(typeof x === 'string' || typeof x === 'number') {
    console.log("Your statement");
}

où x est un nom de variable de votre choix

4
Tanah

La réponse de @ BitOfUniverse est bonne et je propose un nouveau moyen:

function isNum(n) {
    return !isNaN(n/0);
}

isNum('')  // false
isNum(2)   // true
isNum('2k') // false
isNum('2')  //true

Je sais que 0 ne peut pas être un dividende, mais ici la fonction fonctionne parfaitement.

3
towry

le meilleur moyen que j'ai trouvé qui pense aussi aux nombres positifs et négatifs est de: O'Reilly Javascript et DHTML Cookbook :

function isNumber(elem) {
var str = elem.value;
var oneDecimal = false;
var oneChar = 0;
// make sure value hasn't cast to a number data type
str = str.toString( );
for (var i = 0; i < str.length; i++) {
    oneChar = str.charAt(i).charCodeAt(0);
    // OK for minus sign as first character
    if (oneChar =  = 45) {
        if (i =  = 0) {
            continue;
        } else {
            alert("Only the first character may be a minus sign.");
            return false;
        }
    }
    // OK for one decimal point
    if (oneChar =  = 46) {
        if (!oneDecimal) {
            oneDecimal = true;
            continue;
        } else {
            alert("Only one decimal is allowed in a number.");
            return false;
        }
    }
    // characters outside of 0 through 9 not OK
    if (oneChar < 48 || oneChar > 57) {
        alert("Enter only numbers into the field.");
        return false;
    }
}
return true;

}

3
Alex Peta

puisqu'une chaîne telle que '1234' avec typeof affichera 'chaîne', et que l'inverse ne peut jamais se produire (typeof 123 sera toujours un nombre), le mieux est d'utiliser une expression rationnelle simple /^\-?\d+$/.test(var). /^[\-\+]?[\d]+\.?(\d+)?$/ L’aspect important de .test est qu’il NE LANCE PAS d’exception si la variable var n’est pas une chaîne, la valeur peut être quelconque. 

var val, regex = /^[\-\+]?[\d]+\.?(\d+)?$/;

regex.test(val)       // false 
val = '1234';
regex.test(val)       // true
val = '-213';
regex.test(val)       // true
val = '-213.2312';
regex.test(val)       // true
val = '+213.2312';
regex.test(val)       // true
val = 123;
regex.test(val)       // true
val = new Number(123);
regex.test(val)       // true
val = new String('123');
regex.test(val)       // true
val = '1234e';
regex.test(val)       // false 
val = {};
regex.test(val)       // false 
val = false;
regex.test(val)       // false 
regex.test(undefined) // false 
regex.test(null)      // false 
regex.test(window)    // false 
regex.test(document)  // false 

Si vous recherchez le type réel, alors seul typeof fera l'affaire. 

3
pocesar

Jsut un FYI, si vous utilisez jQuery vous avez

$.isNumeric() 

pour gérer cela. Plus de détails sur http://api.jquery.com/jQuery.isNumeric/

3
Angelos

Euh? Il suffit d'utiliser des expressions régulières! :)

function isInteger(val) {
  return val.match(/^[0-9]$/)
}

function isFloat(val) {
  return val.match(/^[0-9]*/\.[0-9]+$/)
}
3
hackerdiehack

jQuery utilise ceci:

function isNumber(obj) {
  return !isNaN( parseFloat( obj ) ) && isFinite( obj );
}
2

L'opération XOR peut être utilisée pour détecter un nombre ou une chaîne. nombre ^ 0 donnera toujours le nombre en sortie et chaîne ^ 0 donnera 0 en sortie.

Example: 
   1)  2 ^ 0 = 2
   2)  '2' ^ 0  = 2
   3)  'Str' ^ 0 = 0
1
Himanshu Shekhar
function IsNumeric(num) {
    return ((num >=0 || num < 0)&& (parseInt(num)==num) );
}
0
hosein

Que penses-tu de celui-ci? 

const numberOrString='10' 
const isNumber = !isNaN(numberOrString*1) 
0
Yoraco Gonzales

Pour détecter les nombres, le passage suivant de JavaScript: The Good Parts de Douglas Crockford est pertinent:

La fonction isFinite est le meilleur moyen de déterminer si une valeur peut être utilisée sous forme de nombre car elle rejette NaN et Infinity. Malheureusement, isFinite essaiera de convertir son opérande en nombre. Ce n'est donc pas un bon test si une valeur n'est pas réellement un nombre. Vous voudrez peut-être définir votre propre fonction isNumber:

var isNumber = function isNumber(value) { return typeof value === 'number' &&
            isFinite(value);
};
0
Stephen Niedzielski

Vous pouvez simplement utiliser:

!isNaN(+variable);
0
Amir Forsati

Très tard à la fête; Cependant, ce qui suit a toujours bien fonctionné pour moi lorsque je souhaite vérifier si une entrée est une chaîne ou un nombre d'un coup.

return !!Object.prototype.toString.call(input).match(/\[object (String|Number)\]/);
0
Wil Moore III

Simplement utiliser 

myVar.constructor == String

ou

myVar.constructor == Number

si vous souhaitez gérer des chaînes définies comme des objets ou des littéraux et que vous enregistrez, vous ne souhaitez pas utiliser de fonction d'assistance.

0
Jonathon

Créé un jsperf sur la vérification si une variable est un nombre. Plutôt interessant! typeof a effectivement une utilisation performante. En utilisant typeof pour autre chose que des nombres, la vitesse est généralement 1/3 de celle d'un variable.constructor puisque la majorité des types de données en javascript sont des objets; les chiffres ne sont pas!

http://jsperf.com/jemiloii-fastest-method-to-check-if-type-is-a-number

typeof variable === 'number' | le plus rapide | si vous voulez un nombre, tel que 5, et non '5'
typeof parseFloat(variable) === 'number' | le plus rapide | si vous voulez un nombre, tel que 5 et '5'

isNaN() est plus lent, mais pas beaucoup plus lent. J'avais de grands espoirs pour parseInt et parseFloat, mais ils étaient horriblement plus lents.

0
jemiloii