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ée | Number(s) | +s | parseInt(s, 10) | parseFloat(s) |
|---|---|---|---|---|
"42" | 42 | 42 | 42 | 42 |
"3.99" | 3.99 | 3.99 | 3 | 3.99 |
"42px" | NaN | NaN | 42 | 42 |
"" | 0 | 0 | NaN | NaN |
" 3 " | 3 | 3 | 3 | 3 |
"1e3" | 1000 | 1000 | 1 | 1000 |
"0x1F" | 31 | 31 | 0 | 0 |
"1,000" | NaN | NaN | 1 | 1 |
"12_000" | NaN | NaN | 12 | 12 |
"abc" | NaN | NaN | NaN | NaN |
Les règles derrière ce tableau :
Numberet le+unaire sont identiques. Ils convertissent toute la chaîne après avoir retiré les espaces, comprennent1e3et l'hexadécimal0x, et renvoientNaNs'il reste quoi que ce soit. Une chaîne vide ou composée uniquement d'espaces devient0.parseIntetparseFloatlisent 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 donneNaN.parseIntabandonne la partie décimale et ne comprend pas les exposants :"1e3"s'arrête aue.- 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âche | Code | Type du résultat |
|---|---|---|
| Chaîne en nombre, strict | Number(s) ou +s | number (peut-être NaN) |
| Entier en début de texte | parseInt(s, 10) | number (peut-être NaN) |
| Décimal en début de texte | parseFloat(s) | number (peut-être NaN) |
| Vérifier le résultat | Number.isFinite(n), Number.isNaN(n) | boolean |
| Grand entier | BigInt(s) | bigint |
| Nombre en chaîne | String(n), n.toString(), `${n}` | string |
| Décimales fixes | n.toFixed(2) | string |
| Autre base | n.toString(16) | string |
| Séparateurs de milliers | n.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 ?
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.