domingo, 13 de fevereiro de 2011

Tutorial Java: Convertendo uma String em Decimal, Hexadecimal ou Octal em Inteiro

Este artigo é um complemento para o artigo anterior desta série: Convertendo Binário, Octal, Hexadecimal em Inteiro em Java. A diferença entre os dois é que, no artigo citado, você precisa saber em qual formato (sistema numérico) o número está (precisa saber se está em decimal, em octal, ou em hexadecimal antes de tentar a conversão). Assim, a conversão seria feita facilmente com sobrecargas dos métodos valueOf ou parseInt, ambos da classe Integer. Este artigo ensina uma técnica para converter uma String em formato numérico desconhecido em um Inteiro.
A técnica apresentada no primeiro artigo pode ser muito útil em cenários como:

  • Leitura de dados de um arquivo XML;
  • Entrada de dados oriundo de interconversões;
  • Entradas específicas para determinados formatos (ex: uma classe que exige forçosamente a entrada de uma String em hexadecimal para a perfeita computação de seus dados, e não só a simples conversão desta String em inteiro);

A técnica apresentada neste artigo é mais flexível e pode ser usada em cenários como:

  • Entrada de dados de um componente gráfico (ex: Swing);
  • Entrada de dados de um formulário Web;
  • Entrada de dados de um arquivo texto sem formatação rigorosa (ex: um CSV);


  • Aferindo o Sistema Numérico de uma String e Convertendo-a em Inteiro

Para situações como esta, a classe Integer tem um método que é uma "mão na roda": o método estático decode(String s). Seu retorno é um Integer carregado com o valor correspondente ao que a String represente. Ele reconhece tanto valores decimais quanto octais e hexadecimais, positivos ou negativos.
Note que, para valores hexadecimais, é preciso informar o "0x" ou "0X" na frente, e para valores octais, o "0" na frente. Isto é necessário para que se cumpra a convenção numérica e que se evite ambigüidades no reconhecimento do sistema numérico empregado (sem isso, um valor como "12" estaria em decimal, octal ou hexadecimal?? Você saberia dizer?? Nem eu!!). Se nada for informado, supõe-se que o valor esteja em decimal. O método pode lançar um NumberFormatException. Esta exceção não é marcada (unchecked), mas pode ser sabiamente capturada.

Exemplo: decodificando uma String em hexadecimal:

String hexadecimal = "0xff";
Integer result = Integer.decode(hexadecimal);
System.out.println(result);

// Resultado:
255

Exemplo: decodificando uma String em octal:

String octal = "010";
Integer result = Integer.decode(octal);
System.out.println(result);

// Resultado:
8

Exemplo: decodificando uma String em decimal:

String decimal = "10";
Integer result = Integer.decode(decimal);
System.out.println(result);

// Resultado:
10


  • Interconvertendo os Dados!!

Como o resultado é sempre um Integer, e não um int (primitivo), ele pode ser igualmente auto-vertido para qualquer formato:

String number = "16";
Integer result = Integer.decode(number);
System.out.println(Integer.toHexString(result));
System.out.println(Integer.toOctalString(result));
System.out.println(Integer.toBinaryString(result));

// Resultado:
10
20
10000


  • Observações

1- Lá em cima eu havia afirmado que a técnica apresentada neste artigo permite a conversão de uma String em formato numérico desconhecido, ou seja, você não precisa saber em que formato ela está. É claro que estou fazendo uma metonímia e, assim, refiro-me não a você, desenvolvedor, mas ao código de seu programa. O mais formal seria: seu programa não precisa saber de antemão em que formato está a String para funcionar corretamente. Isto é uma coisa boa pois permite a aplicação do conceito de ocultamento de Orientação a Objetos. Na verdade, a entrada de dados precisa ser de alguma forma conhecida, para evitar ambigüidades ou para evitar o lançamento de uma exceção. Disto, não há escapatória, infelizmente...

2- Todos os exemplos foram testados e nenhum deles se machucou no processo de feitura deste artigo. :-)

3- Feliz?? Triste?? Este artigo salvou a sua vida (ou seu emprego) ou você agora odeia o Pajé?? Não faz mal, pelo menos COMENTE!!!

2 comentários:

Unknown disse...

legal mas não tem como fazer do modo mais dificil

O Pajé disse...

Como assim um modo mais difícil?? A conversão está totalmente implementada na API do Java, precisando apenas usar o método correto. Não poderia ser mais fácil!!