Menu

Convertir string a number en TypeScript (y number a string)

Convierte un string a número en TypeScript con Number(), parseInt(), parseFloat() o el + unario, mira cómo trata cada uno entradas como "42px", "" y "1e3", comprueba NaN de forma segura y convierte números de vuelta a strings.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Para convertir un string a número en TypeScript, llama a Number(text). El resultado tiene tipo number, y vale NaN cuando el texto no es un número válido. Para texto con caracteres al final, como "42px", usa parseInt(text, 10) o parseFloat(text).

Las cuatro conversiones devuelven el tipo number. TypeScript no sabe si el texto era válido; un string inválido sigue dando un number, cuyo valor es NaN.

Por qué hay que convertir

Los campos de formulario, los parámetros de URL, las variables de entorno y el contenido de los ficheros llegan como strings. TypeScript no te deja usar uno donde se espera un número:

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.

La aritmética con -, * y / sobre un string es un error. + está permitido pero concatena, así que "3" + 10 es el string "310"; por eso la conversión tiene que ir primero: Number(quantity) * 10.

Una aserción de tipo tampoco sirve. quantity as number se rechaza (TS2352), y forzarlo con as unknown as number solo silencia al compilador: el valor sigue siendo un string en tiempo de ejecución.

Number frente a parseInt, parseFloat y el + unario

Las cuatro funciones coinciden con una entrada limpia y discrepan en todo lo demás. Esta tabla es la salida real de cada una en Node:

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

Las reglas detrás de la tabla:

  • Number y el + unario son idénticos. Convierten el string entero tras quitar los espacios, entienden 1e3 y el hexadecimal 0x, y devuelven NaN si sobra algo. Un string vacío o solo con espacios se convierte en 0.
  • parseInt y parseFloat leen desde el principio y se detienen en el primer carácter que no pueden usar, así que "42px" y "1,000" dan números parciales. Un string vacío es NaN.
  • parseInt descarta la parte decimal y no entiende exponentes: "1e3" se detiene en la e.
  • Los separadores numéricos (12_000) son válidos en el código fuente, no en los strings.

Number es la opción más estricta para validar entradas. parseInt y parseFloat sirven para texto que de verdad lleva una unidad o un sufijo, como los tamaños de CSS.

Entradas inválidas: NaN

NaN tiene tipo number, así que el compilador nunca avisa de él. Comprueba tú el resultado, con Number.isNaN o Number.isFinite:

Devolver number | undefined hace que el fallo forme parte del tipo, así que cada llamada debe manejarlo antes de hacer aritmética. Number.isFinite también rechaza Infinity, que Number("Infinity") devuelve sin problema.

Evita el isNaN(x) global: convierte su argumento primero, así que en JavaScript isNaN("abc") es true. La declaración de TypeScript solo acepta un number, así que pasar un string es el error TS2345, una pista para usar Number.isNaN sobre un valor ya convertido.

String a entero

Pasa siempre a parseInt su segundo argumento, la base: 10 para texto decimal. Es opcional, pero documenta la intención e importa para otras bases. Para obtener un entero de un string decimal, convierte y luego redondea de forma explícita.

parseInt espera un string: parseInt(12.7) es un error de compilación (TS2345), y eso es útil, porque en JavaScript parseInt sobre un número lo convierte primero a texto y da respuestas erróneas con valores como 0.0000005 (devuelve 5). Usa Math.trunc para números. Para enteros mayores que Number.MAX_SAFE_INTEGER, BigInt(text) interpreta el valor completo (y lanza un SyntaxError con texto inválido en lugar de devolver NaN).

Número a string

Cualquiera de String(n), n.toString() y `${n}` convierte un número a su forma de string más corta. Los métodos de formato dan más control:

toFixed redondea el valor binario, no el decimal que escribiste, así que (1.005).toFixed(2) es "1.00": 1.005 se guarda como algo un poco menor que 1.005. Para dinero, guarda las cantidades como céntimos enteros o formatea con Intl.NumberFormat.

String(n) también funciona con null y undefined (da "null" y "undefined"), mientras que n.toString() sería un error de compilación con strict, porque el valor podría faltar.

Referencia rápida

TareaCódigoTipo del resultado
String a número, estrictoNumber(s) o +snumber (puede ser NaN)
Entero inicial de un textoparseInt(s, 10)number (puede ser NaN)
Decimal inicial de un textoparseFloat(s)number (puede ser NaN)
Comprobar el resultadoNumber.isFinite(n), Number.isNaN(n)boolean
Entero grandeBigInt(s)bigint
Número a stringString(n), n.toString(), `${n}`string
Decimales fijosn.toFixed(2)string
Otra basen.toString(16)string
Separadores de milesn.toLocaleString("en-US")string

Preguntas frecuentes

¿Cómo convierto un string a número en TypeScript?

Usa Number(text). Devuelve un number: el valor si el texto es numérico válido, NaN para cualquier otra cosa y 0 para un string vacío o que solo tiene espacios. Usa parseInt(text, 10) o parseFloat(text) cuando el texto pueda llevar caracteres al final, como "42px".

¿Puedo convertir un string a número con as number?

No. "42" as number es un error de compilación (TS2352), e incluso forzándolo a través de unknown, una aserción solo cambia el tipo que ve el compilador: en tiempo de ejecución el valor sigue siendo el string "42". Convierte el valor con Number(), parseInt() o parseFloat().

¿Qué diferencia hay entre Number() y parseInt() en TypeScript?

Number convierte el string entero y devuelve NaN si alguna parte no es numérica, así que Number("42px") es NaN. parseInt lee dígitos desde el principio y se detiene en el primer carácter que no es un dígito, así que parseInt("42px", 10) es 42, y descarta los decimales. Number("") es 0, mientras que parseInt("") es NaN.

¿Cómo compruebo si un string es un número válido?

Conviértelo y comprueba el resultado: const n = Number(text); if (text.trim() !== "" && Number.isFinite(n)) { ... }. La comprobación del string vacío importa porque Number("") es 0. Usa Number.isNaN, no el isNaN global, que de todos modos TypeScript solo acepta con un argumento number.

¿Cómo convierto un número a string en TypeScript?

String(n), n.toString() o un template literal `${n}` dan el mismo resultado. Usa n.toFixed(2) para un número fijo de decimales, n.toString(16) para otra base y n.toLocaleString("en-US") para separadores de miles.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR