Menu

Converter string para number em TypeScript (e number para string)

Converta uma string em número no TypeScript com Number(), parseInt(), parseFloat() ou + unário, veja como cada um trata entradas como "42px", "" e "1e3", verifique NaN com segurança e converta números de volta em strings.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

Para converter uma string em número no TypeScript, chame Number(text). O resultado tem o tipo number e é NaN quando o texto não é um número válido. Para texto com caracteres no final, como "42px", use parseInt(text, 10) ou parseFloat(text).

As quatro conversões retornam o tipo number. O TypeScript não sabe se o texto era válido; uma string inválida ainda gera um number, cujo valor é NaN.

Por que é preciso converter

Campos de formulário, parâmetros de URL, variáveis de ambiente e conteúdo de arquivos chegam como strings. O TypeScript não deixa você usar uma string onde se espera um 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.

Aritmética com -, * e / em uma string é erro. + é permitido, mas concatena, então "3" + 10 é a string "310"; por isso a conversão precisa vir primeiro: Number(quantity) * 10.

Uma type assertion também não resolve. quantity as number é rejeitado (TS2352), e forçar com as unknown as number só silencia o compilador: em tempo de execução o valor continua sendo uma string.

Number vs parseInt vs parseFloat vs + unário

As quatro funções concordam em entradas limpas e discordam em todo o resto. Esta tabela mostra a saída real de cada uma no 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

As regras por trás da tabela:

  • Number e o + unário são idênticos. Eles convertem a string inteira depois de remover os espaços das pontas, entendem 1e3 e hexadecimal com 0x e retornam NaN se sobrar alguma coisa. Uma string vazia ou só com espaços vira 0.
  • parseInt e parseFloat leem a partir do início e param no primeiro caractere que não conseguem usar, então "42px" e "1,000" dão números parciais. Uma string vazia é NaN.
  • parseInt descarta a parte fracionária e não entende expoentes: "1e3" para no e.
  • Separadores numéricos (12_000) são válidos no código-fonte, não em strings.

Number é a opção mais rígida para validar entradas. parseInt e parseFloat servem para texto que de fato traz uma unidade ou sufixo, como tamanhos em CSS.

Tratando entradas inválidas: NaN

NaN tem o tipo number, então o compilador nunca avisa sobre ele. Verifique o resultado você mesmo, com Number.isNaN ou Number.isFinite:

Retornar number | undefined torna a falha parte do tipo, então todo código que chama a função precisa tratá-la antes de fazer contas. Number.isFinite também rejeita Infinity, que Number("Infinity") retorna sem reclamar.

Evite o isNaN(x) global: ele converte o argumento primeiro, então isNaN("abc") é true no JavaScript. A declaração do TypeScript só aceita um number, então passar uma string é o erro TS2345, um sinal para usar Number.isNaN em um valor já convertido.

String para inteiro

Sempre passe o segundo argumento de parseInt, a base: 10 para texto decimal. Ele é opcional, mas deixa a intenção clara e faz diferença em outras bases. Para obter um inteiro de uma string decimal, converta e depois arredonde explicitamente.

parseInt espera uma string: parseInt(12.7) é um erro de compilação (TS2345), o que é útil, porque no JavaScript parseInt em um número primeiro o converte em texto e dá respostas erradas para valores como 0.0000005 (retorna 5). Use Math.trunc para números. Para inteiros acima de Number.MAX_SAFE_INTEGER, BigInt(text) lê o valor completo (e lança um SyntaxError para texto inválido em vez de retornar NaN).

Número para string

Qualquer um entre String(n), n.toString() e `${n}` converte um número na sua forma de string mais curta. Os métodos de formatação dão mais controle:

toFixed arredonda o valor binário, não o decimal que você digitou, então (1.005).toFixed(2) é "1.00": 1.005 é armazenado como um pouco menos que 1.005. Para dinheiro, guarde os valores como centavos inteiros ou formate com Intl.NumberFormat.

String(n) também funciona com null e undefined (gerando "null" e "undefined"), enquanto n.toString() seria um erro de compilação com strict, já que o valor pode estar ausente.

Referência rápida

TarefaCódigoTipo do resultado
String para número, rígidoNumber(s) ou +snumber (pode ser NaN)
Inteiro no início do textoparseInt(s, 10)number (pode ser NaN)
Decimal no início do textoparseFloat(s)number (pode ser NaN)
Verificar o resultadoNumber.isFinite(n), Number.isNaN(n)boolean
Inteiro grandeBigInt(s)bigint
Número para stringString(n), n.toString(), `${n}`string
Casas decimais fixasn.toFixed(2)string
Outra basen.toString(16)string
Separadores de milharn.toLocaleString("en-US")string

Perguntas frequentes

Como converter uma string em número no TypeScript?

Use Number(text). Ele retorna um number: o valor para texto numérico válido, NaN para qualquer outra coisa e 0 para uma string vazia ou só com espaços. Use parseInt(text, 10) ou parseFloat(text) quando o texto pode ter caracteres no final, como "42px".

Posso converter uma string em número com as number?

Não. "42" as number é um erro de compilação (TS2352) e, mesmo forçando por unknown, uma assertion muda só o tipo que o compilador enxerga: em tempo de execução o valor continua sendo a string "42". Converta o valor com Number(), parseInt() ou parseFloat().

Qual é a diferença entre Number() e parseInt() no TypeScript?

Number converte a string inteira e retorna NaN se alguma parte não for numérica, então Number("42px") é NaN. parseInt lê dígitos a partir do início e para no primeiro caractere que não é dígito, então parseInt("42px", 10) é 42, e ele descarta as casas decimais. Number("") é 0, enquanto parseInt("") é NaN.

Como verificar se uma string é um número válido?

Converta e teste o resultado: const n = Number(text); if (text.trim() !== "" && Number.isFinite(n)) { ... }. A verificação da string vazia importa porque Number("") é 0. Use Number.isNaN, e não o isNaN global, que de qualquer forma o TypeScript só aceita com um argumento number.

Como converter um número em string no TypeScript?

String(n), n.toString() ou um template literal `${n}` dão o mesmo resultado. Use n.toFixed(2) para um número fixo de casas decimais, n.toString(16) para outra base e n.toLocaleString("en-US") para separadores de milhar.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR