Comment analyser des nombres en JavaScript
Lorsque vous lisez une valeur depuis un champ de formulaire, un paramètre d’URL ou une réponse d’API JSON, elle arrive presque toujours sous forme de chaîne de caractères. Avant de pouvoir effectuer des calculs avec, vous devez la convertir en nombre. JavaScript vous offre plusieurs méthodes pour y parvenir, et elles se comportent suffisamment différemment pour que choisir la mauvaise provoque des bugs subtils. Cet article couvre les principales méthodes, quand utiliser chacune, et les cas limites qui piègent le plus souvent les développeurs.
Points clés à retenir
parseInt()etparseFloat()effectuent une analyse partielle, lisant de gauche à droite et s’arrêtant au premier caractère invalide — utile pour des chaînes comme"24px".Number()et l’opérateur unaire+exigent que la chaîne entière soit valide, retournantNaNdans le cas contraire — idéal pour les conversions strictes de données d’API.- Passez toujours le paramètre radix à
parseInt()et validez toujours les résultats avecNumber.isNaN()plutôt qu’avec la fonction globaleisNaN(). - Utilisez
BigInt()pour les entiers au-delà deNumber.MAX_SAFE_INTEGER, et normalisez les chaînes formatées selon les paramètres régionaux avant l’analyse.
Comparaison rapide : méthodes de conversion chaîne-vers-nombre en JavaScript
| Méthode | Entrée "42px" | Entrée "3.14" | Entrée "" | Entrée "abc" |
|---|---|---|---|---|
parseInt("42px", 10) | 42 | 3 | NaN | NaN |
parseFloat("42px") | 42 | 3.14 | NaN | NaN |
Number("42px") | NaN | 3.14 | 0 | NaN |
+"42px" | NaN | 3.14 | 0 | NaN |
parseInt() : analyse partielle pour les entiers
parseInt(string, radix) lit les caractères de gauche à droite et s’arrête dès qu’elle rencontre quelque chose qu’elle ne peut pas analyser. Cela la rend utile pour des chaînes comme "24px" ou "10rem", où le nombre vient en premier.
parseInt("24px", 10) // 24
parseInt("3.99", 10) // 3 (le point décimal arrête l'analyse)
parseInt("abc", 10) // NaN (le premier caractère est invalide)
Passez toujours le paramètre radix. Sans lui, parseInt traite les chaînes commençant par 0x comme hexadécimales et analyse sinon en base 10. Bien que les moteurs modernes utilisent par défaut la base 10, omettre le radix est une source bien connue de bugs et rend votre intention peu claire.
parseInt("0xFF", 16) // 255 — analyse hexadécimale explicite
parseInt("011", 10) // 11 — le radix évite toute ambiguïté
Un comportement non évident : parseInt s’arrête au point décimal dans "6.022e23", donc parseInt("6.022e23", 10) retourne 6, pas 602200000000000000000000. N’utilisez pas parseInt pour tronquer de grands nombres à virgule flottante. Utilisez plutôt Math.trunc().
parseFloat() : analyse partielle pour les décimaux
parseFloat() fonctionne de la même manière que parseInt mais préserve la partie décimale. Elle n’a pas de paramètre radix et analyse toujours en base 10.
parseFloat("3.14rem") // 3.14
parseFloat("1e3") // 1000 — comprend la notation scientifique
parseFloat("px10") // NaN — le premier caractère est invalide
Utilisez parseFloat lorsque l’entrée peut contenir une valeur décimale et que vous souhaitez la préserver.
Number() et l’opérateur unaire + : conversion stricte
Number() et l’opérateur unaire + exigent tous deux que la chaîne entière soit un nombre valide. Si une partie ne l’est pas, vous obtenez NaN. Cette rigueur est un avantage lorsque vous travaillez avec des réponses d’API ou des données de formulaire validées, où une analyse partielle serait une erreur silencieuse.
Number("42") // 42
Number("3.14") // 3.14
Number("42px") // NaN — plus strict que parseInt
Number("") // 0 — attention à ce cas
+"42" // 42 — comportement identique, syntaxe plus courte
Le cas limite de la chaîne vide est important dans le traitement des formulaires. Number("") retourne 0, pas NaN, ce qui peut masquer une valeur manquante. Vérifiez toujours l’entrée vide avant de convertir.
Discover how at OpenReplay.com.
Les séparateurs numériques ne fonctionnent pas à l’exécution
Le code source JavaScript autorise 1_000_000 comme littéral numérique, mais cette syntaxe ne se transpose pas à l’analyse de chaînes.
parseInt("1_000", 10) // 1 — l'analyse s'arrête au trait de soulignement
Number("1_000") // NaN
Si votre API ou saisie utilisateur utilise des traits de soulignement comme séparateurs de milliers, supprimez-les d’abord avec str.replace(/_/g, "").
BigInt() : analyse de grands entiers
Le type Number de JavaScript perd en précision au-delà de Number.MAX_SAFE_INTEGER (2⁵³ − 1). Pour des valeurs plus grandes — identifiants de base de données, valeurs cryptographiques, entiers financiers — utilisez BigInt().
BigInt("9007199254740993") // 9007199254740993n — exact
Number("9007199254740993") // 9007199254740992 — décalé d'une unité
Passez la chaîne directement à BigInt(). Ne la passez pas d’abord par parseInt, car la précision est déjà perdue à ce stade. Notez que les valeurs BigInt ne peuvent pas être mélangées avec des valeurs Number ordinaires dans des opérations arithmétiques sans conversion explicite.
Analyse tenant compte des paramètres régionaux
JavaScript n’a pas de fonction intégrée pour analyser des nombres formatés selon les paramètres régionaux comme "1.234,56" (courant dans les locales allemandes ou espagnoles). Vous devez normaliser la chaîne manuellement avant l’analyse :
const raw = "1.234,56"
const normalized = raw.replace(/\./g, "").replace(",", ".")
parseFloat(normalized) // 1234.56
Quelle méthode devriez-vous utiliser ?
- Saisie utilisateur ou valeurs CSS avec unités →
parseInt(str, 10)ouparseFloat() - Réponses d’API ou données strictement validées →
Number()ou opérateur unaire+ - Entiers au-delà de 2⁵³ − 1 →
BigInt() - Toujours valider que le résultat n’est pas
NaNavant de l’utiliser :
const qty = parseInt(input, 10)
if (Number.isNaN(qty)) {
// gérer l'entrée invalide
}
Utilisez Number.isNaN(), pas la fonction globale isNaN(). La version globale convertit d’abord son argument, ce qui signifie que isNaN("") retourne false même si "" n’est pas un nombre.
Conclusion
La bonne méthode d’analyse de nombres en JavaScript dépend de ce que vous savez sur votre entrée. Utilisez parseInt ou parseFloat lorsque l’analyse partielle est acceptable et attendue. Utilisez Number() ou l’opérateur unaire + lorsque la chaîne entière doit être un nombre valide. Recourez à BigInt() lorsque la précision compte pour de grands entiers. Dans tous les cas, vérifiez la présence de NaN avant d’utiliser le résultat.
FAQ
parseInt lit une chaîne de gauche à droite et s'arrête au premier caractère qu'elle ne peut pas interpréter comme faisant partie d'un entier. Number exige que la chaîne entière soit une valeur numérique valide. Par exemple, parseInt de 42px retourne 42, tandis que Number de 42px retourne NaN. Utilisez parseInt pour une analyse partielle et Number pour une conversion stricte.
La spécification ECMAScript définit qu'une chaîne vide se convertit en 0 lorsqu'elle est passée à Number ou à l'opérateur unaire plus. Cela peut masquer des valeurs de formulaire manquantes. Vérifiez toujours si la chaîne d'entrée est vide avant de la convertir en nombre pour éviter de traiter les champs vides comme zéro.
Utilisez BigInt lorsque l'entier dépasse Number.MAX_SAFE_INTEGER, qui est 2 puissance 53 moins 1. Au-delà de ce seuil, Number perd en précision et peut arrondir silencieusement les valeurs. Passez la chaîne numérique directement à BigInt plutôt que de la convertir via parseInt ou Number d'abord, car la précision est perdue lors de cette étape intermédiaire.
La fonction globale isNaN convertit son argument en nombre avant de vérifier, ce qui produit des résultats trompeurs. Par exemple, isNaN d'une chaîne vide retourne false car la chaîne vide est convertie en 0. Number.isNaN évite la conversion et ne retourne true que si la valeur est littéralement NaN, ce qui en fait le choix fiable pour la validation.
Complete picture for complete understanding
Capture every clue your frontend is leaving so you can instantly get to the root cause of any issue with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data.
Check our GitHub repo and join the thousands of developers in our community.