Comment vérifier un nombre en JavaScript

Les nombres sont un type primitif en JavaScript, mais la simple utilisation de typeof ne permettra pas de différencier les nombres de NaN ou Infinity.

23 sept, 2019 – 6 min de lecture

.

Photo d’Alex Chambers sur Unsplash

Il est utile de savoir comment vérifier si une valeur est du type primitif nombre, puisque JavaScript est un langage dynamiquement typé.

La façon la plus simple de vérifier si un nombre est un nombre est d’utiliser typeof, qui retournera la chaîne "number" pour toute valeur du type primitif nombre, notamment NaNInfinity, et -Infinity.

Un exemple où un nombre pourrait apparaître comme un autre type, indiquant un bug dans mon code, serait dans l’analyse de la monnaie :

Dans ce cas, je saurais que j’ai oublié d’analyser la chaîne en un nombre lorsque je récupère la valeur de « string » à partir de typeof.

.

Photo de Samuel Zeller sur Unsplash

Si j’utilise parseFloat() pour vérifier la valeur de la devise, mais que j’ai oublié de dépouiller le symbole de la monnaie, j’obtiens un échec d’analyse et un résultat étrange :

Oh, non. Dans ce cas, il semble que typeof ne fonctionne pas comme je l’attendais – car les valeurs NaN sont considérées comme des nombres en JavaScript.

Photo de Gemma Evans sur Unsplash

Quand le mot-clé typeof renvoie « nombre »

Une solution évidente pour vérifier le type primitif nombre est d’utiliser le mot-clé typeof, comme je l’ai montré ci-dessus.

Mais typeof est une solution incomplète, à cause de deux valeurs spéciales en JavaScript : NaN (« Not a Number ») et Infinity.

Pour mon exemple de monnaie, je sais que j’ai un bug si ma valeur monétaire est NaN ou Infinity, mais typeof renvoie "number" pour ces deux valeurs.

Peut-être que mon entrée a été écrite en utilisant un symbole monétaire, et que j’ai simplement essayé d’utiliser parseFloat() pour capturer la valeur. Cela donnerait lieu à NaN :

.

Photo de Timo Kaiser sur Unsplash

Une fonction isNumber() personnalisée

Arobuste, fonction personnalisée isNumber() utiliserait typeof pour vérifier le type primitif, vérifier les valeurs NaN et vérifier Infinity :

Ou, dans le cas où l’on est sûr que NaN et Infinity ne vont pas apparaître, il suffirait de vérifier que typeof==="number" serait suffisant.

.

Photo de 🇨🇭 Claudio Schwarz | @purzlbaum sur Unsplash

La one-liner

J’adore les one-liners. Je pense qu’ils doivent être documentés avec des commentaires, mais je pense qu’ils sont en fait vraiment utiles, pas seulement fantaisistes.

Voici le one-liner pour savoir comment vérifier un nombre en JavaScript :

Mais, il existe une meilleure façon de vérifier un nombre fini en JavaScript – la fonction d’aide Number.isFinite() a le même comportement que la fonction personnalisée isNumber() que j’ai écrite. J’inclus un exemple dans la section suivante.

.

Photo de Bernard Hermant sur Unsplash

La façon la plus simple de vérifier l’existence d’un nombre : Number.isFinite()

Il n’est en fait pas nécessaire d’écrire des fonctions personnalisées pour vérifier la présence d’un nombre, bien que ce soit un moyen instructif de se rappeler que les valeurs JavaScript Infinity-Infinity et NaN sont toutes du type primitif nombre.

« La méthode Number.isFinite() détermine si la valeur passée est un nombre fini. » – MDN Docs

La méthode Number.isFinite() renverra true pour les nombres finis, et false pour Infinity-Infinity, et NaN – exactement ce que nous voulons :

Il existe également la fonction globale isFinite(), qui effectuera la coercition de type (comme la coercition des chaînes de caractères vers les nombres), comme indiqué ci-dessus.

J’aborde ces méthodes en profondeur dans mon article sur Infinity dans The Startup :

.

Photo de Bogomil Mihaylov sur Unsplash

Vérifier si une variable est un entier

Pour vérifier si la variable A est un entier, je pourrais utiliser l’opérateur d’égalité libre == pour voir si la valeur analysée est égale à elle-même.

Le bout de code suivant donne un exemple de la façon de vérifier si un entier est un entier :

L’utilisation de typeof permettrait de différencier une chaîne de caractères contrainte en un nombre d’un nombre réel, tout comme l’opérateur d’égalité stricte ===.

.

Photo de Markus Spiske sur Unsplash

Supprimer les symboles monétaires

Pour une meilleure, fonction plus robuste, je pourrais vouloir dépouiller les symboles monétaires (comme le signe dollar et toute virgule) en premier lieu.

L’analyse approfondie de la monnaie à l’aide d’expressions régulières en JavaScript dépasse le cadre de cet article, mais ce code supprime $ et , avant l’analyse :

Notez que les fonctions globales parseInt() et parseFloat() contraindront les valeurs en chaînes de caractères, si nécessaire, et renverront NaN si la coercition échoue.

Il existe également les fonctions Numbers.parseInt() et Number.parseFloat(), qui ont exactement le même comportement.

Selon les MDN Docs, ces fonctions dupliquées ont été ajoutées à ECMAScript 2015 pour la  » modularisation des globaux à des fins utiles. »

.

Photo de Toa Heftiba sur Unsplash

Le JavaScript a-t-il réellement des entiers séparés ?

Non, JavaScript n’a qu’un seul type de nombre, qui est représenté en interne comme une représentation à virgule flottante de 64 bits.

Cette virgule flottante est le type de données primitif nombre, et il existe également un type appelé BigInt qui peut être utilisé pour des nombres arbitrairement grands.

Les fonctions globales parseInt() et parseFloat() diffèrent dans ce qu’elles attendent et produiront, mais pas parce qu’il existe réellement des types entiers et à virgule flottante distincts en JavaScript.

Photo de Volkan Olmez sur Unsplash

Conclusion

La vérification d’un nombre en JavaScript n’est pas particulièrement compliquée – typeof fonctionne fondamentalement comme il se doit, tant que l’on sait que les deux NaN et Infinity ont le numéro typeof.

La façon la plus simple de vérifier s’il s’agit d’un nombre fini (c’est-à-dire. pas NaN ou Infinity) en JavaScript est d’utiliser Number.isFinite(), qui ne coerce pas les valeurs en nombres, ou le global isFinite(), qui effectue une coercition de type.

La vérification d’un nombre entier implique spécifiquement l’utilisation de la fonction parseInt(), suivie de la comparaison de la valeur analysée à elle-même à l’aide de == (qui effectuera une coercition de type sur les valeurs non numériques, comme les chaînes de caractères, pour les transformer en nombres) ou === (qui ne renverra true que si les deux valeurs sont des nombres).

Sous le capot, les entiers et les flottants sont tous les mêmes : JavaScript n’a qu’un seul type de nombre, le type primitif nombre.

Photo de K. Mitch Hodge sur Unsplash

Lecture complémentaire

  • La fonction Number.isInteger() ne coerce pas les chaînes de caractères en nombres :
  • Sumit Kumar Pradhan a écrit sur la vérification des nombres sur Dev.to:
  • Chris Ferdinandi discute de l’analyse syntaxique des nombres sur son blog vanilla JS:
  • L’expression régulière ^+(\.{1,2})?$ correspond à l’argent:
  • Sarah Dayan a écrit sur l’analyse syntaxique de l’argent en JavaScript sur frontstuff :

.

Photo d’Alejandro Ortiz sur Unsplash

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *