Menu

Convertire una stringa in numero in TypeScript (e viceversa)

Converti una stringa in numero in TypeScript con Number(), parseInt(), parseFloat() o il + unario, guarda come ciascuno gestisce input come "42px", "" e "1e3", controlla NaN in modo sicuro e riconverti i numeri in stringhe.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

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:

InputNumber(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

Le regole dietro la tabella:

  • Number e il + unario sono identici. Convertono l'intera stringa dopo aver tolto gli spazi ai lati, capiscono 1e3 e l'esadecimale 0x, e restituiscono NaN se avanza qualcosa. Una stringa vuota o di soli spazi diventa 0.
  • parseInt e parseFloat leggono dall'inizio e si fermano al primo carattere che non possono usare, quindi "42px" e "1,000" danno numeri parziali. Una stringa vuota è NaN.
  • parseInt scarta la parte decimale e non capisce gli esponenti: "1e3" si ferma alla e.
  • 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

ObiettivoCodiceTipo del risultato
Da stringa a numero, severoNumber(s) o +snumber (forse NaN)
Intero iniziale da un testoparseInt(s, 10)number (forse NaN)
Decimale iniziale da un testoparseFloat(s)number (forse NaN)
Controllare il risultatoNumber.isFinite(n), Number.isNaN(n)boolean
Intero grandeBigInt(s)bigint
Da numero a stringaString(n), n.toString(), `${n}`string
Decimali fissin.toFixed(2)string
Altra basen.toString(16)string
Separatori delle migliaian.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?

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.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA