Per convertire una stringa in numero in TypeScript, chiama Number(text). Il risultato ha tipo number, ed è NaN quando il testo non è un numero valido. Per un testo con caratteri in coda, come "42px", usa parseInt(text, 10) o parseFloat(text).
Tutte e quattro le conversioni restituiscono il tipo number. TypeScript non sa se il testo era valido: anche una stringa non valida dà un number, il cui valore è NaN.
Perché devi convertire
Campi dei form, parametri degli URL, variabili d'ambiente e contenuti dei file arrivano come stringhe. TypeScript non ti permette di usarne una dove si aspetta un numero:
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'aritmetica con -, * e / su una stringa è un errore. + è permesso ma concatena, quindi "3" + 10 è la stringa "310": ecco perché la conversione deve venire prima, Number(quantity) * 10.
Nemmeno una type assertion aiuta. quantity as number viene rifiutato (TS2352), e forzarlo con as unknown as number zittisce solo il compilatore: in esecuzione il valore resta una stringa.
Number, parseInt, parseFloat e più unario a confronto
Le quattro funzioni concordano sugli input puliti e divergono su tutto il resto. Questa tabella è l'output reale di ciascuna su Node:
| Input | 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 |
Le regole dietro la tabella:
Numbere il+unario sono identici. Convertono l'intera stringa dopo aver tolto gli spazi ai lati, capiscono1e3e l'esadecimale0x, e restituisconoNaNse avanza qualcosa. Una stringa vuota o di soli spazi diventa0.parseInteparseFloatleggono dall'inizio e si fermano al primo carattere che non possono usare, quindi"42px"e"1,000"danno numeri parziali. Una stringa vuota èNaN.parseIntscarta la parte decimale e non capisce gli esponenti:"1e3"si ferma allae.- I separatori numerici (
12_000) sono validi nel codice sorgente, non nelle stringhe.
Number è la scelta più severa per validare l'input. parseInt e parseFloat vanno bene per testi che portano davvero un'unità o un suffisso, come le dimensioni CSS.
Gestire l'input non valido: NaN
NaN ha tipo number, quindi il compilatore non avvisa mai. Controlla il risultato tu, con Number.isNaN o Number.isFinite:
Restituire number | undefined rende il fallimento parte del tipo, così ogni chiamante deve gestirlo prima di fare calcoli. Number.isFinite rifiuta anche Infinity, che Number("Infinity") restituisce senza problemi.
Evita l'isNaN(x) globale: converte prima il suo argomento, quindi in JavaScript isNaN("abc") è true. La dichiarazione di TypeScript accetta solo un number, quindi passare una stringa è l'errore TS2345, un indizio per usare Number.isNaN su un valore già convertito.
Da stringa a intero
Passa sempre a parseInt il secondo argomento, la base (radix): 10 per il testo decimale. È opzionale, ma documenta l'intenzione e conta per le altre basi. Per ottenere un intero da una stringa decimale, converti e poi arrotonda in modo esplicito.
parseInt si aspetta una stringa: parseInt(12.7) è un errore di compilazione (TS2345), ed è utile, perché in JavaScript parseInt su un numero lo converte prima in testo e dà risposte sbagliate per valori come 0.0000005 (restituisce 5). Per i numeri usa Math.trunc. Per interi oltre Number.MAX_SAFE_INTEGER, BigInt(text) interpreta il valore completo (e lancia un SyntaxError sul testo non valido invece di restituire NaN).
Da numero a stringa
String(n), n.toString() e `${n}` convertono tutti un numero nella sua forma testuale più corta. I metodi di formattazione danno più controllo:
toFixed arrotonda il valore binario, non il decimale che hai scritto, quindi (1.005).toFixed(2) è "1.00": 1.005 è memorizzato come un valore leggermente inferiore a 1,005. Per il denaro, tieni gli importi in centesimi interi o formatta con Intl.NumberFormat.
String(n) funziona anche su null e undefined (dando "null" e "undefined"), dove n.toString() sarebbe un errore di compilazione con strict, perché il valore potrebbe mancare.
Riepilogo rapido
| Obiettivo | Codice | Tipo del risultato |
|---|---|---|
| Da stringa a numero, severo | Number(s) o +s | number (forse NaN) |
| Intero iniziale da un testo | parseInt(s, 10) | number (forse NaN) |
| Decimale iniziale da un testo | parseFloat(s) | number (forse NaN) |
| Controllare il risultato | Number.isFinite(n), Number.isNaN(n) | boolean |
| Intero grande | BigInt(s) | bigint |
| Da numero a stringa | String(n), n.toString(), `${n}` | string |
| Decimali fissi | n.toFixed(2) | string |
| Altra base | n.toString(16) | string |
| Separatori delle migliaia | n.toLocaleString("en-US") | string |
Domande frequenti
Come si converte una stringa in numero in TypeScript?
Usa Number(text). Restituisce un number: il valore per un testo numerico valido, NaN per tutto il resto e 0 per una stringa vuota o fatta solo di spazi. Usa parseInt(text, 10) o parseFloat(text) quando il testo può avere caratteri in coda, come "42px".
Posso fare il cast di una stringa a numero con as number?
as number?No. "42" as number è un errore di compilazione (TS2352), e anche forzandolo passando da unknown, un'asserzione cambia solo il tipo che vede il compilatore: in esecuzione il valore resta la stringa "42". Converti il valore con Number(), parseInt() o parseFloat().
Che differenza c'è tra Number() e parseInt() in TypeScript?
Number converte l'intera stringa e restituisce NaN se una parte non è numerica, quindi Number("42px") è NaN. parseInt legge le cifre dall'inizio e si ferma al primo carattere non numerico, quindi parseInt("42px", 10) è 42, e scarta i decimali. Number("") è 0, mentre parseInt("") è NaN.
Come controllo se una stringa è un numero valido?
Convertila e verifica il risultato: const n = Number(text); if (text.trim() !== "" && Number.isFinite(n)) { ... }. Il controllo sulla stringa vuota conta perché Number("") è 0. Usa Number.isNaN, non l'isNaN globale, che comunque TypeScript accetta solo con un argomento number.
Come si converte un numero in stringa in TypeScript?
String(n), n.toString() o un template literal `${n}` danno tutti lo stesso risultato. Usa n.toFixed(2) per un numero fisso di decimali, n.toString(16) per un'altra base e n.toLocaleString("en-US") per i separatori delle migliaia.