Menu

Convertir une string en number en TypeScript (et inversement)

Convertir une chaîne en nombre en TypeScript avec Number(), parseInt(), parseFloat() ou le + unaire, voir comment chacun traite des entrées comme "42px", "" et "1e3", vérifier NaN sans risque, et reconvertir les nombres en chaînes.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

Pour convertir une chaîne en nombre en TypeScript, appelez Number(text). Le résultat est de type number, et il vaut NaN quand le texte n'est pas un nombre valide. Pour un texte suivi d'autres caractères, comme "42px", utilisez parseInt(text, 10) ou parseFloat(text).

Les quatre conversions renvoient le type number. TypeScript ne sait pas si le texte était valide ; une chaîne invalide donne quand même un number, dont la valeur est NaN.

Pourquoi il faut convertir

Les champs de formulaire, les paramètres d'URL, les variables d'environnement et le contenu des fichiers arrivent sous forme de chaînes. TypeScript ne vous laisse pas en utiliser une là où un nombre est attendu :

index.ts(3,23): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.

L'arithmétique avec -, * et / sur une chaîne est une erreur. + est autorisé mais concatène, donc "3" + 10 donne la chaîne "310" : c'est pourquoi la conversion doit venir en premier, Number(quantity) * 10.

Une assertion de type n'aide pas non plus. quantity as number est refusé (TS2352), et le forcer via as unknown as number ne fait que faire taire le compilateur : la valeur reste une chaîne à l'exécution.

Number, parseInt, parseFloat ou + unaire

Les quatre fonctions s'accordent sur une entrée propre et divergent sur tout le reste. Ce tableau montre la sortie réelle de chacune sous Node :

EntréeNumber(s)+sparseInt(s, 10)parseFloat(s)
"42"42424242
"3.99"3.993.9933.99
"42px"NaNNaN4242
""00NaNNaN
" 3 "3333
"1e3"1000100011000
"0x1F"313100
"1,000"NaNNaN11
"12_000"NaNNaN1212
"abc"NaNNaNNaNNaN

Les règles derrière ce tableau :

  • Number et le + unaire sont identiques. Ils convertissent toute la chaîne après avoir retiré les espaces, comprennent 1e3 et l'hexadécimal 0x, et renvoient NaN s'il reste quoi que ce soit. Une chaîne vide ou composée uniquement d'espaces devient 0.
  • parseInt et parseFloat lisent depuis le début et s'arrêtent au premier caractère qu'ils ne savent pas utiliser, si bien que "42px" et "1,000" donnent des nombres partiels. Une chaîne vide donne NaN.
  • parseInt abandonne la partie décimale et ne comprend pas les exposants : "1e3" s'arrête au e.
  • Les séparateurs numériques (12_000) sont valides dans le code source, pas dans les chaînes.

Number est le choix le plus strict pour valider une entrée. parseInt et parseFloat conviennent aux textes qui portent réellement une unité ou un suffixe, comme les tailles CSS.

Gérer une entrée invalide : NaN

NaN est de type number, le compilateur ne vous en avertit donc jamais. Vérifiez le résultat vous-même, avec Number.isNaN ou Number.isFinite :

Renvoyer number | undefined fait de l'échec une partie du type : chaque appelant doit le traiter avant de faire des calculs. Number.isFinite refuse aussi Infinity, que Number("Infinity") renvoie sans problème.

Évitez le isNaN(x) global : il convertit d'abord son argument, donc isNaN("abc") vaut true en JavaScript. La déclaration de TypeScript n'accepte qu'un number, donc passer une chaîne provoque l'erreur TS2345, ce qui invite à utiliser Number.isNaN sur une valeur déjà convertie.

Chaîne en entier

Passez toujours à parseInt son second argument, la base : 10 pour un texte décimal. Il est facultatif, mais il documente l'intention et compte pour les autres bases. Pour obtenir un entier à partir d'une chaîne décimale, convertissez puis arrondissez explicitement.

parseInt attend une chaîne : parseInt(12.7) est une erreur de compilation (TS2345), ce qui est utile, car en JavaScript parseInt appliqué à un nombre le convertit d'abord en texte et donne de mauvaises réponses pour des valeurs comme 0.0000005 (il renvoie 5). Utilisez Math.trunc pour les nombres. Pour les entiers au-delà de Number.MAX_SAFE_INTEGER, BigInt(text) analyse la valeur complète (et lève une SyntaxError sur un texte invalide au lieu de renvoyer NaN).

Nombre en chaîne

String(n), n.toString() et `${n}` convertissent tous un nombre en sa forme textuelle la plus courte. Les méthodes de formatage donnent plus de contrôle :

toFixed arrondit la valeur binaire, pas le décimal que vous avez tapé, donc (1.005).toFixed(2) vaut "1.00" : 1.005 est stocké comme une valeur légèrement inférieure à 1,005. Pour de l'argent, gardez les montants en centimes entiers ou formatez avec Intl.NumberFormat.

String(n) fonctionne aussi sur null et undefined (en donnant "null" et "undefined"), là où n.toString() serait une erreur de compilation avec strict, puisque la valeur peut être absente.

Référence rapide

TâcheCodeType du résultat
Chaîne en nombre, strictNumber(s) ou +snumber (peut-être NaN)
Entier en début de texteparseInt(s, 10)number (peut-être NaN)
Décimal en début de texteparseFloat(s)number (peut-être NaN)
Vérifier le résultatNumber.isFinite(n), Number.isNaN(n)boolean
Grand entierBigInt(s)bigint
Nombre en chaîneString(n), n.toString(), `${n}`string
Décimales fixesn.toFixed(2)string
Autre basen.toString(16)string
Séparateurs de milliersn.toLocaleString("en-US")string

Questions fréquentes

Comment convertir une chaîne en nombre en TypeScript ?

Utilisez Number(text). La fonction renvoie un number : la valeur pour un texte numérique valide, NaN pour tout le reste, et 0 pour une chaîne vide ou composée uniquement d'espaces. Utilisez parseInt(text, 10) ou parseFloat(text) quand le texte peut se terminer par d'autres caractères, comme "42px".

Peut-on caster une chaîne en nombre avec as number ?

Non. "42" as number est une erreur de compilation (TS2352), et même forcée via unknown, une assertion ne change que le type vu par le compilateur : la valeur reste la chaîne "42" à l'exécution. Convertissez la valeur avec Number(), parseInt() ou parseFloat().

Quelle est la différence entre Number() et parseInt() en TypeScript ?

Number convertit la chaîne entière et renvoie NaN si une partie n'est pas numérique : Number("42px") vaut donc NaN. parseInt lit les chiffres depuis le début et s'arrête au premier caractère qui n'en est pas un : parseInt("42px", 10) vaut 42, et il abandonne les décimales. Number("") vaut 0, alors que parseInt("") vaut NaN.

Comment vérifier qu'une chaîne est un nombre valide ?

Convertissez-la et testez le résultat : const n = Number(text); if (text.trim() !== "" && Number.isFinite(n)) { ... }. La vérification de la chaîne vide compte, car Number("") vaut 0. Utilisez Number.isNaN, pas le isNaN global, que TypeScript n'accepte de toute façon qu'avec un argument number.

Comment convertir un nombre en chaîne en TypeScript ?

String(n), n.toString() ou un template literal `${n}` donnent tous le même résultat. Utilisez n.toFixed(2) pour un nombre fixe de décimales, n.toString(16) pour une autre base, et n.toLocaleString("en-US") pour les séparateurs de milliers.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER