Conversão entre Número e String em Java: parseInt, valueOf, toString e Armadilhas Comuns

目次

1. Conhecimento Básico para Conversão entre Números e Strings em Java

Ao desenvolver em Java, você inevitavelmente encontrará situações como “dados que parecem um número, mas são tratados como string” ou “valores recebidos como strings que você quer calcular como números”. Por exemplo, entradas de formulário, importações de CSV, respostas de API e saída de logs costumam chegar como strings mesmo que pareçam numéricos.
Nesta seção, organizaremos por que a conversão é necessária e os pontos que iniciantes costumam ter dificuldade.

1.1 Por que a Conversão se Torna Necessária

Programas Java tratam o tipo de dado (type) de forma explícita. Contudo, as entradas e saídas de dados do mundo real tendem a se tornar “strings”, como por exemplo:

  • Entrada do usuário : Mesmo que você digite “123” em uma caixa de texto, o que o programa recebe é basicamente uma string
  • Arquivos (CSV / JSON / arquivos de configuração) : Quando você os lê, costuma obter valores como strings
  • HTTP/API : Muitos valores são passados como strings (ou o tipo JSON pode ser ambíguo)
  • Exibição e logs : Em vez de imprimir números como estão, é comum convertê‑los para strings e formatá‑los

Por causa disso, duas direções de conversão ocorrem frequentemente no trabalho real:

  • Number → String : exibição na UI, logs, mensagens, concatenação, etc.
  • String → Number : cálculos, comparações, verificações de intervalo, agregação, etc.

O que importa aqui é: mesmo que pareça numérico, tipos diferentes significam coisas diferentes.

  • "10" (string) e 10 (número) podem parecer iguais, mas são tipos diferentes no código
  • String "10" + "2" torna‑se "102" (concatenação)
  • Número 10 + 2 torna‑se 12 (adição)

Erros como “eu pensei que estava somando, mas acabou em concatenação de string” acontecem facilmente se você não mantiver essa distinção em mente.

1.2 Java É Rigoroso com os Tipos

Java é uma linguagem estaticamente tipada, então operações com tipos incompatíveis geralmente resultam em erro de compilação. Isso aumenta a segurança, mas ao mover entre tipos diferentes como strings e números, você precisa de conversões adequadas.

Por exemplo, se você tentar usar uma entrada de string diretamente como número, receberá um erro.

  • Você quer calcular usando a string "123" como um int → É preciso convertê‑la para int antes de usá‑la

Além disso, Java possui dois tipos de tipos numéricos: tipos primitivos e classes wrapper, que podem ser uma fonte comum de confusão.

  • Tipos primitivos: int, long, double, etc. (leve, números básicos)
  • Classes wrapper: Integer, Long, Double, etc. (números tratados como objetos)

Por exemplo, Integer.valueOf("123") devolve um Integer (objeto), enquanto Integer.parseInt("123") devolve um int (primitivo).
Abordaremos essa diferença com mais detalhes na próxima seção, mas iniciantes costumam ficar presos porque “a mesma conversão parece retornar tipos diferentes”.

1.3 Diferenças entre Conversão Automática e Explícita

Quando você ouve “conversão”, pode imaginar que Java a faz automaticamente. Na verdade, há comportamentos que parecem conversão automática em alguns casos.

Um exemplo comum é a concatenação de strings.

  • Se você escrever "Total: " + 10, o 10 parece ser convertido automaticamente em string

Entretanto, embora seja conveniente, isso também pode gerar resultados indesejados.

  • "10" + 2"102" (concatenação de string, não adição numérica)

Portanto, Java tem casos em que valores são implicitamente transformados em string, mas String → Number basicamente não é convertido automaticamente.
Em outras palavras:

  • Number → String : pode acontecer implicitamente em alguns contextos (como concatenação)
  • String → Number : sempre requer conversão explícita (como parseInt)

Lembrar disso manterá você seguro.

Além disso, ao converter strings para números, as entradas nem sempre são válidas.

  • String vazia ""
  • Espaços " 123 "
  • Separador de milhar "1,000"
  • Tentar converter um decimal "12.34" para int
  • Caracteres não numéricos "12a"

Em tais casos, uma exceção em tempo de execução (tipicamente NumberFormatException) ocorrerá.
Em sistemas do mundo real, é crucial projetar assumindo que “entrada inválida pode chegar”.

2. Como Converter Números em Strings

Nesta seção, explicaremos as formas mais comuns de converter números em strings em Java, juntamente com como escolher entre elas.
Essa conversão é usada constantemente em logs, saída de UI e construção de mensagens.

2.1 Usando String.valueOf() (Mais Comum)

Para converter números em strings, a abordagem mais segura e recomendada é String.valueOf().

int i = 100;
String s = String.valueOf(i);

Ela suporta não apenas int, mas também long, double, float, boolean e quase todos os tipos primitivos.

double d = 12.34;
String s = String.valueOf(d);

Principais características dessa abordagem:

  • Sintaxe consistente que é fácil de lembrar
  • Funciona com tipos primitivos e classes wrapper
  • Alta legibilidade
  • Intenção clara (“esta é uma conversão para string” à primeira vista)

Ela também transforma objetos wrapper em strings de forma segura.

Integer num = null;
String s = String.valueOf(num); // "null"

Mesmo se você passar null, não lançará uma NullPointerException, o que é especialmente útil para logging.

2.2 Usando Integer.toString() / Double.toString()

Cada classe wrapper numérica fornece um método utilitário toString().

int i = 100;
String s = Integer.toString(i);
double d = 12.34;
String s = Double.toString(d);

Isso funciona corretamente, mas tem essas características:

  • O método difere por tipo (Integer / Double / Long, etc.)
  • É um pouco tedioso lembrar de todos eles
  • Menos versátil que String.valueOf()

Então, em projetos reais, String.valueOf() é frequentemente preferido, a menos que você queira enfatizar explicitamente um tipo específico.

2.3 Cuidado ao Chamar toString() em Objetos

Você também pode chamar toString() diretamente em objetos wrapper ou em seus próprios objetos.

Integer i = 100;
String s = i.toString();

Isso funciona, mas você deve ter cuidado se null for possível.

Integer i = null;
String s = i.toString(); // NullPointerException

Se o objeto for null, isso causará um erro em tempo de execução.
Para segurança, String.valueOf() é mais adequado em casos como:

  • Saída de log
  • Geração de strings de depuração
  • Caminhos de código onde null pode aparecer

2.4 Deve-se Usar “+ “”” para Conversão?

Você pode ter visto código como este:

int i = 100;
String s = i + "";

Sim, ele converte um número em uma string. No entanto, essa não é uma abordagem recomendada.

Razões:

  • A intenção não é óbvia à primeira vista
  • É ambíguo se é concatenação ou conversão
  • Frequentemente criticado em revisões de código
  • Mais propenso a causar mal-entendidos durante mudanças futuras

Pode aparecer em demos curtas ou testes rápidos, mas é melhor evitá-lo para código mantível.

2.5 Resumo: Como Escolher a Conversão Número → String

Para evitar confusão no trabalho real, lembre-se disto:

  • Escolha padrão: String.valueOf()
  • Se quiser enfatizar o tipo: Integer.toString() / Double.toString()
  • Chamar toString() em objetos requer consciência de null
  • Evite + “” em princípio

3. Como Converter Strings em Números

A partir daqui, explicaremos o tópico especialmente importante em projetos reais: converter strings em números.
Como entrada do usuário e dados externos não são garantidos como válidos, entender métodos de conversão e armadilhas é essencial.

3.1 Usando Integer.parseInt() (Mais Básico)

Um método representativo para converter uma string em um int é Integer.parseInt().

String s = "123";
int i = Integer.parseInt(s);

Esse método retorna o tipo primitivo int, o que é conveniente quando você quer realizar cálculos ou comparações imediatamente.

int total = Integer.parseInt("10") + Integer.parseInt("20");
// total is 30

No entanto, passar strings como as seguintes causará uma exceção em tempo de execução.

  • "abc"
  • "" (string vazia)
  • "12.3" (decimal)
  • "1.000" (com vírgulas)
    int i = Integer.parseInt("abc"); // NumberFormatException
    

Essa exceção não é detectada em tempo de compilação—ela ocorre em tempo de execução, portanto você deve ter cuidado.

3.2 Usando Integer.valueOf()

Integer.valueOf() é outra forma representativa de converter uma string em um número.

String s = "123";
Integer i = Integer.valueOf(s);

A maior diferença em relação ao parseInt() é que o tipo de retorno é Integer (uma classe wrapper).

  • parseInt()int
  • valueOf()Integer

Essa diferença importa em cenários como:

  • Armazenar valores em coleções (List / Map)
  • Projetos que lidam com null
  • Quando você quer tratar o valor como um objeto

Internamente, valueOf() também lança NumberFormatException se a conversão falhar.
Portanto, não é “menos propenso a erros” que o parseInt().

3.3 Como Escolher Entre parseInt e valueOf

Se você não tem certeza de qual usar, esses critérios ajudam:

  • Se o objetivo é cálculo ou comparação → parseInt()
  • Se você quer tratá‑lo como um objeto → valueOf()

Como o Java moderno possui autoboxing, a diferença prática é menor, mas ainda é importante desenvolver o hábito de escolher com base no tipo de retorno.

3.4 Convertendo para Outros Tipos Numéricos Como double / long

Frequentemente você precisa converter strings para tipos diferentes de inteiros.

long l = Long.parseLong("100000");
double d = Double.parseDouble("12.34");

As regras básicas são as mesmas:

  • Long.parseLong()long
  • Double.parseDouble()double
  • Float.parseFloat()float

Todos lançam NumberFormatException se a string não puder ser convertida.

Um ponto crítico é tentar converter uma string decimal para um tipo inteiro:

int i = Integer.parseInt("12.34"); // exception

Nesse caso, você precisa de um design que trate o valor como double desde o início.

3.5 Atenção a Espaços no Início/Fim

A entrada do usuário costuma conter espaços inadvertidos.

String s = " 123 ";
int i = Integer.parseInt(s); // exception

Nesses casos, é comum usar trim() antes da conversão.

int i = Integer.parseInt(s.trim());

Entretanto, mesmo após trim(), uma exceção ocorrerá se permanecerem caracteres não numéricos.

3.6 Resumo: Pontos‑Chave para Conversão de String → Número

Para converter strings em números com segurança, mantenha em mente os seguintes pontos:

  • Sempre desconfie de entrada externa
  • Projete assumindo que exceções podem ocorrer
  • Decida claramente o tipo numérico (int / long / double)
  • Pré‑processamento quando necessário (trim, etc.)

4. Conversões Usando BigDecimal e BigInteger (Finanças / Cálculos de Precisão)

Os tipos int e double introduzidos até aqui são convenientes, mas é preciso cautela quando a precisão dos cálculos é crítica.
Especialmente para dinheiro, quantidades e taxas, BigDecimal e BigInteger são usados para evitar erros de arredondamento e perda de precisão.

4.1 Por Que double Não É Suficiente

Como double é um tipo de ponto flutuante, ele é armazenado internamente como uma aproximação em binário.
Como resultado, você pode observar comportamentos como este:

double d = 0.1 + 0.2;
System.out.println(d); // 0.30000000000000004

Isso não é um bug—é o comportamento esperado.
Pode parecer pequeno, mas pode ser fatal em casos como:

  • Cálculos monetários
  • Processamento de faturamento e liquidação
  • Cálculos cumulativos de juros ou razões

Nesses casos, você precisa de um tipo que não introduza erro de ponto flutuante.

4.2 Conversão de String → Número Usando BigDecimal

Com BigDecimal, a regra é: crie‑o a partir de uma string.

BigDecimal bd = new BigDecimal("12.34");

Um padrão que você deve evitar é:

BigDecimal bd = new BigDecimal(12.34); // not recommended

Porque o double original já contém um erro de aproximação; convertê‑lo para BigDecimal propagará esse erro.

Lembre‑se: sempre crie BigDecimal a partir de uma String.

4.3 Conversão de Number → String (BigDecimal)

Para converter BigDecimal em uma string, costuma‑se usar toString().

BigDecimal bd = new BigDecimal("12.3400");
String s = bd.toString(); // "12.3400"

Se precisar de formatação para exibição, pode usar DecimalFormat, mas a melhor prática é separar o processamento interno da formatação de exibição.

4.4 Quando Usar BigInteger

BigInteger é usado para lidar com inteiros muito grandes.

BigInteger bi = new BigInteger("12345678901234567890");

Casos de uso típicos:

  • Números com contagem de dígitos extremamente alta
  • Representação numérica de IDs ou valores de hash
  • Cálculos inteiros que excedem o intervalo de long

É menos comum em aplicações de negócios típicas, mas é eficaz quando você precisa manipular inteiros com limites desconhecidos ou ilimitados.

4.5 Resumo: Como Pensar em BigDecimal / BigInteger

  • Dinheiro / cálculos críticos de precisão → BigDecimal
  • Inteiros enormes → BigInteger
  • BigDecimal deve ser criado a partir de String
  • Mantenha a formatação separada dos cálculos

5. Erros Comuns Durante a Conversão e Como Tratá‑los

Ao converter strings em números, deve‑se assumir que erros podem acontecer a qualquer momento.
Nesta seção, organizamos as exceções mais comuns e abordagens seguras de tratamento.

5.1 O Que é NumberFormatException?

NumberFormatException é uma exceção em tempo de execução lançada quando uma string não pode ser interpretada como número.

int i = Integer.parseInt("abc"); // NumberFormatException

Essa exceção não é detectada em tempo de compilação – aparece apenas quando o código é executado.
Portanto, se a entrada vem de fora (formulários, arquivos, APIs, etc.), você deve sempre considerá‑la.

Causas comuns incluem:

  • Contém caracteres não numéricos
  • String vazia ou nula
  • Tentativa de converter um decimal para um tipo inteiro
  • Contém vírgulas ou símbolos (ex.: “1,000”)

5.2 Tratamento Básico com try‑catch

A abordagem mais simples é usar try‑catch para capturar a exceção.

try {
    int i = Integer.parseInt(input);
} catch (NumberFormatException e) {
    // Handling when conversion fails
}

Pontos chave:

  • Lida de forma confiável com o caminho de erro
  • Torna o comportamento de falha explícito
  • É a prática mais comum em projetos reais

Combinado com logging e mensagens de erro, isso permite um processamento seguro.

5.3 Estratégia de Pré‑verificação para Evitar Exceções

Além do tratamento de exceção, você pode validar previamente se a string é numérica.

boolean isNumber = input.matches("\\d+");

Com uma expressão regular, é possível verificar se a string contém apenas dígitos. Contudo, há ressalvas importantes:

  • Difícil suportar decimais e números negativos
  • Pode ficar complexo
  • Não oferece garantia completa

Portanto, na prática, costuma‑se tratar try‑catch como a rede de segurança final.

5.4 Cuidado com null e Strings Vazias

Antes da conversão numérica, é importante checar se a string é nula ou vazia.

if (input == null || input.isEmpty()) {
    // Error handling
}

Ignorar essa verificação pode gerar exceções ou comportamentos inesperados.
Strings vazias são especialmente comuns em entradas de formulário e arquivos de configuração.

5.5 Resumo: Como Pensar no Tratamento de Erros

  • Considere a entrada externa como potencialmente inválida
  • Use try‑catch para capturar exceções de forma confiável
  • Use pré‑verificações como validação complementar
  • Exclua null e strings vazias logo no início

6. Métodos de Conversão Recomendados por Caso de Uso

Até aqui, cobrimos as principais formas de converter entre números e strings em Java.
Nesta seção, organizamos a mentalidade baseada em casos de uso para que você não hesite no desenvolvimento real.

6.1 Exibição na UI e Saída de Log

Para exibição na UI e logs, segurança e legibilidade são prioritárias.

Recomendado:

  • Number → String: String.valueOf()
  • Mesmo quando pode haver um objeto envolvido, use String.valueOf()
    log.info("count=" + String.valueOf(count));
    

Mesmo que null possa aparecer, ele impede exceções.

6.2 Cálculos e Comparações

Para cálculos e comparações, a regra básica é converter para tipos numéricos o quanto antes.

  • String → Número: parseInt() / parseLong() / parseDouble()
  • Após a conversão, concluir o processamento usando tipos numéricos
    int price = Integer.parseInt(inputPrice);
    int total = price * quantity;
    

Continuar a processar como strings pode causar bugs sutis.

6.3 Entradas de Formulário e Processamento de Dados Externos

Trate a entrada do usuário e os dados externos sob a suposição de que valores inválidos chegarão.

  • verificações de null / string vazia
  • tratamento de exceções via try‑catch
  • retornar mensagens de erro conforme necessário
    try {
        int age = Integer.parseInt(input);
    } catch (NumberFormatException e) {
        // Input error handling
    }
    

Evite escrever “apenas o caminho feliz” — pense primeiro nos caminhos de erro.

6.4 Dinheiro e Processamento Crítico de Precisão

Para dinheiro, taxas e outros casos em que erro de ponto flutuante não é aceitável, use BigDecimal.

  • String → BigDecimal: new BigDecimal(String)
  • Separe a formatação para exibição dos cálculos
    BigDecimal amount = new BigDecimal(inputAmount);
    

A chave é não passar por double.

6.5 Armazenamento em Coleções ou Manipulação como Objetos

Ao armazenar valores em uma List ou Map, ou quando seu design lida com null, as classes wrapper são adequadas.

  • Integer.valueOf()
  • Long.valueOf()
    List<Integer> list = new ArrayList<>();
    list.add(Integer.valueOf("10"));
    

6.6 Resumo por Caso de Uso

Resumido por caso de uso:

  • Exibição / logs → String.valueOf()
  • Cálculos → parseXxx()
  • Dinheiro / precisão → BigDecimal
  • Entrada externa → projetar para exceções
  • Coleções → valueOf()

7. Erros Comuns e Anti‑Padrões

Converter entre números e strings é básico, mas tanto iniciantes quanto desenvolvedores experientes podem cometer erros.
Esta seção resume os anti‑padrões que você deve evitar em projetos reais.

7.1 Tentando Calcular Mantendo Strings

Esse código parece plausível, mas é arriscado:

String a = "10";
String b = "20";
String result = a + b; // "1020"

Isso não é cálculo — é concatenação de strings.
Para cálculos numéricos, converta para tipos numéricos primeiro:

int result = Integer.parseInt(a) + Integer.parseInt(b); // 30

7.2 Uso Excessivo de “+ “”” para Conversão

String s = value + "";

Funciona, mas a intenção não fica clara e a manutenibilidade é baixa, portanto não é recomendado.

  • Provavelmente será apontado em revisões de código
  • Confunde quem lê mais tarde
  • Ambíguo se é conversão ou concatenação

Usar String.valueOf() explicitamente é mais seguro.

7.3 Passar double Diretamente para BigDecimal

BigDecimal bd = new BigDecimal(0.1); // not recommended

Isso é perigoso porque usa um double que já contém erro de aproximação.

A abordagem correta:

BigDecimal bd = new BigDecimal("0.1");

Para dinheiro e casos críticos de precisão, sempre crie a partir de uma string.

7.4 Escrever Código Pressupondo que Exceções Não Ocorrerão

int i = Integer.parseInt(input);

Em projetos reais, a suposição de que a entrada é sempre válida raramente se sustenta.
Ao lidar com entrada externa, inclua sempre tratamento de exceções:

try {
    int i = Integer.parseInt(input);
} catch (NumberFormatException e) {
    // Error handling
}

7.5 Usar Valores Sem Estar Ciente das Diferenças de Tipo

Também é comum usar tipos sem considerar diferenças como int vs Integer, ou double vs BigDecimal.

  • Seu objetivo é cálculo?
  • Seu objetivo é exibição?
  • A precisão é crítica?

Escolher tipos com base no propósito é a maneira mais rápida de prevenir bugs.

8. Resumo

Em Java, converter entre números e strings é algo cotidiano, mas também um processo onde pequenos erros podem gerar grandes problemas.

Principais lições deste artigo:

  • Para Number → String, String.valueOf() é o padrão
  • Para String → Number, escolha entre parseXxx() e valueOf() com base no tipo de retorno
  • Trate entradas externas assumindo que exceções podem ocorrer
  • Use BigDecimal para dinheiro e cálculos críticos de precisão
  • Evite padrões ambíguos como + ""

Em vez de memorizar métodos, é mais importante escolher com base no caso de uso e no tipo.
Com essa mentalidade, você ficará preso muito menos vezes ao processamento fundamental do Java.

9. Perguntas Frequentes (FAQ)

Aqui resumimos os pontos problemáticos mais comuns para leitores que pesquisam “java number string conversion” em formato de perguntas e respostas.
Esta seção tem o objetivo de preencher lacunas que podem permanecer após a leitura do texto principal.

Q1. Qual é a melhor maneira única de converter um número em string no Java?

Em geral, o método mais recomendado é String.valueOf().

Razões:

  • Consistente e fácil de entender
  • Funciona tanto com tipos primitivos quanto com classes wrapper
  • Não lança exceção ao receber null
    String s = String.valueOf(100);
    

Em projetos reais, usar este como padrão ajuda a evitar erros.

Q2. O que devo usar: parseInt ou valueOf?

Escolha com base no tipo de retorno.

  • Integer.parseInt()int (primitivo)
  • Integer.valueOf()Integer (classe wrapper)

Se seu objetivo são cálculos, use parseInt().
Se quiser armazená‑lo em coleções ou tratá‑lo como objeto, valueOf() é mais adequado.

Q3. Existe uma forma de verificar se uma string é numérica antes de converter?

Uma abordagem simples é usar uma expressão regular.

boolean isNumber = input.matches("\\d+");

Entretanto, esse método tem limitações:

  • Decimais e números negativos são difíceis de suportar
  • Não garante segurança completa

Portanto, na prática, o melhor é assumir que try‑catch ainda é necessário como medida de segurança final.

Q4. Por que ocorre NumberFormatException durante a conversão numérica?

NumberFormatException acontece quando uma string não pode ser interpretada como número.

Causas comuns:

  • Contém caracteres não numéricos
  • String vazia ou null
  • Tentativa de converter um decimal para um tipo inteiro
  • Contém vírgulas ou símbolos

Ao lidar com entradas externas, sempre projete assumindo que exceções podem ocorrer.

Q5. Por que não devo usar double para cálculos monetários?

Porque double é armazenado como uma aproximação em binário, erros de ponto flutuante podem ocorrer.

double d = 0.1 + 0.2; // 0.30000000000000004

Para dinheiro, taxas e outros casos críticos de precisão, a escolha correta é usar BigDecimal criado a partir de uma string.

BigDecimal bd = new BigDecimal("0.1");

Q6. O que devo ter cuidado ao converter valores de formulário em números?

Sempre mantenha esses pontos em mente:

  • Verifique null / strings vazias
  • Capture exceções com try‑catch
  • Defina comportamento claro para casos de erro

Trate a entrada do usuário como “potencialmente inválida” por padrão para evitar bugs.

Q7. E se eu quiser controlar o formato de exibição após converter para string?

Mantenha a conversão numérica e a formatação de exibição separadas.

  • Conversão: String.valueOf() ou BigDecimal
  • Formatação: use DecimalFormat, etc.

Separar o processamento interno da apresentação melhora a manutenibilidade.