Mostrando postagens com marcador Integer. Mostrar todas as postagens
Mostrando postagens com marcador Integer. Mostrar todas as postagens

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!!!

sábado, 8 de maio de 2010

Convertendo Binário, Octal, Hexadecimal em Inteiro em Java

Essa é outra dica rápida de programação na linguagem Java: como converter uma String representando um número binário, octal ou hexadecimal (e, portanto, que podem conter letras, e não somente números) no inteiro correspondente??

Simples: a classe Integer tem duas sobrecargas do método parseInt: uma recebe somente a String, e supostamente esta String está representando um inteiro em base decimal. A outra recebe a String e a base de cálculo para a conversão. Assim, temos:

Primeira sobrecarga:
int value = Integer.parseInt("16");
System.out.println(value);

Console:
16

Internamente, este método: parseInt(String s) não faz nada além de redirecionar a chamada para a segunda sobrecarga, passando a base 10:

Segunda sobrecarga:
int value = Integer.parseInt("16", 10);
System.out.println(value);

Console:
16

Esta segunda sobrecarga pode receber os valores abaixo como base, usando-os para interpretar a String e fazer a conversão necesária:

2 - Binário
8 - Octal
10 - Decimal
16 - Hexadecimal
27 - base 27 (alguém usa isso??)

Assim, podemos converter binários (usando a base 2), octais (usando a base 8), decimais (usando a base 10) e hexadecimais (usando a base 16), além da não menos esdrúxula base 27.
Exemplos:

Binário:
Integer.parseInt("10", 2); - retorna 2
Integer.parseInt("101", 2); - retorna 5
Integer.parseInt("1100110", 2); - retorna 102

Octal:
Integer.parseInt("10", 8); - retorna 8

Hexadecimal:
Integer.parseInt("f", 16); - retorna 15
Integer.parseInt("a", 16); - retorna 10

Base 27:
Integer.parseInt("Kona", 27); - retorna 411787


  • Outra opção:

Ainda na classe Integer, temos a opção de usar o método valueOf, que tem igualmente duas sobrecargas similares, porém retorna o objeto do tipo Integer de valor correspondente, e não o tipo primitivo. Assim, podemos fazer:

Binário:
Integer i = Integer.valueOf("10", 2);
System.out.println(i.intValue()); - imprime 2

Octal:
Integer i = Integer.valueOf("10", 8);
System.out.println(i.intValue()); - imprime 8

Hexadecimal:
System.out.println(Integer.parseInt("f", 16).intValue());
imprime 15

Uma segunda técnica de conversão numérica e de interconversão entre formatos numéricos pode ser obtida na segunda parte deste artigo, clicando-se aqui!!

Espero que esta dica tenha ajudado!! Qualquer coisa: COMENTEM!!!