Neste laboratrio utilizaremos a classe NumberFormat, e Format disponvel no CD do livro Core Java 2 Volume I, para formatar sada em J ava.
1. Introduo
Na linguagem J ava voc pode controlar o formato do que exibido a fim de organizar a sada de dados de forma adequada. A classe NumberFormat do pacote java.text tem trs mtodos que empregam formatos padro para: nmero, valores monetrios e valores de percentuais.
Para obter um formatador para a localizao padro, use um dos trs mtodos a seguir:
Cada um desses mtodos retorna um objeto do tipo NumberFormat. Voc pode usar esse objeto para formatar um ou mais nmeros.
Em seguida, aplica-se o mtodo format ao objeto NumberFormat para obter um string que contm o nmero formatado. Uma vez tendo a string com o nmero formatado, provavelmente voc vai querer simplesmente exibir o novo nmero formatado.
2. Especificaes
Voc tambm pode querer especificar o nmero mnimo e mximo de dgitos inteiros ou de dgitos fracionrios a exibir. Isso pode ser feito atravs dos mtodos da classe NumberFormat:
Observao A especificao do nmero mximo de dgitos fracionrios geralmente til. O ltimo dgito exibido arredondado para cima se o primeiro dgito descartado for superior ou igual a 5. Se voc quiser mostrar zeros iniciais, especifique o nmero mnimo de dgitos fracionrios igual ao mximo. Caso contrrio, ter de deixar o nmero mnimo de dgitos fracionrios igual ao valor padro que 0. A especificao do nmero de dgitos inteiros muito menos comum. Especificar um nmero mnimo fora a exibio de zeros iniciais para valores menores. Especificar um nmero mximo perigoso, pois o valor exibido poder ser truncado sem que ningum perceba, resultando num nmero bem formatado, mas totalmente errado.
3. Formato particular
Voc pode criar tambm um formato particular. Para fazer isso, necessrio definir um objeto DecimalFormat que indica a forma desejada dos nmeros.
As exigncias de formatao so indicadas em uma string de formatao que mostra como o nmero deve ficar. No programa desse laboratrio podemos ver exemplos de formatao.
4. API java.text.NumberFormat
Mtodos Descrio st at i c Number For mat get Cur r encyI nst ance( ) Retorna um objeto NumberFormat para converter valores de moeda em string usando as convenes locais. st at i c Number For mat get Number I nst ance( ) Retorna um objeto NumberFormat para formatar nmeros usando as converes loacis. st at i c Number For mat get Per cent I nst ance( ) Retorna um objeto NumberFormat para converter percentuais em strings. voi d set Maxi mumFr act i onDi gi t s( i nt di gi t os) Parmetro: dgitos, o nmero de dgitos a serem exibidos; Especifica o nmero mximo de dgitos antes do separador decimal do objeto de formatao. Use este mtodo com extrema cautela. Se forem especificados dgitos menos, ento o nmero ser simplesmente truncado. voi d set Mi ni mumFr act i onDi gi t s( i nt di gi t os) Parmetro: dgitos, o nmero de dgitos a serem exibidos; Especifica o nmero mnimo de dgitos antes do separador decimal do objeto de formatao. Se o nmero tiver menos dgitos fracionrios que o mnimo, ento sero acrescentados zeros. voi d set Mi ni mumI nt eger Di gi t s( i nt di gi t os) Parmetro: dgitos, o nmero de dgitos a serem exibidos; Especifica o nmero mnimo de dgitos antes do separador decimal do objeto de formatao. Se o nmero tiver menos dgitos fracionrios que o mnimo, ento sero acrescentados zeros na frente.
5. API java.text.DecimalFormat
Mtodos Descrio voi d Deci mal For mat ( St r i ng padr o) Parmetro: padrao, a string de formatao; Retorna um objeto DecimalFormat que segue o padro fornecido para a converso de nmeros em strings.
6. Criando o projeto
Crie o projeto Laboratorio_06 no workspace do eclipse.
7. Criando o pacote corejava
Com o projeto J ava criado, vamos criar a package corejava, como no Laboratrio 05.
8. Importando o pacote corejava
Idem Laboratrio 05.
9. Criando a classe
Com o projeto J ava criado, vamos criar uma classe com o mtodo main e com o nome Formatacao.
Complete o cdigo de forma que ele fique idntico ao cdigo abaixo:
import j ava. t ext . *;
public class For mat acao { public static void mai n( St r i ng[ ] ar gs) { double x; x = 10000. 0 / 3. 0; / / I mpr i me na sa da padr o o val or de x semf or mat ao Syst em. out . pr i nt l n( x) ; Number For mat nf = Number For mat . get Number I nst ance( ) ; St r i ng f x = nf . f or mat ( x) ; / / a st r i ng ser " 3. 333, 33" Syst em. out . pr i nt l n( f x) ; / / Especi f i cando o nmer o m ni mo e mxi mo de d gi t os nf . set Maxi mumFr act i onDi gi t s( 4) ; nf . set Mi ni mumI nt eger Di gi t s( 6) ; f x = nf . f or mat ( x) ; / / a st r i ng ser " 003. 333, 3333" Syst em. out . pr i nt l n( f x) ; / / Cr i ando f or mat aao par t i cul ar Deci mal For mat df = new Deci mal For mat ( " 0. #####" ) ; / / I mpr i me o nmer o 3333, 333333 Syst em. out . pr i nt l n( df . f or mat ( x) ) ; } / / Fi mdo mt odo mai n } / / Fi mda cl asse For mat ao
Para que possa funcionar certifique-se de adicionar a linha abaixo:
import java.text.*;
10. Executando a classe Formatacao
Clique no boto para executar a classe, e observe o resultado da execuo do seu projeto no console.
11. String de formatao para a classe Decimalformat
Smbolo Significado 0 Um dgito # Um dgito; no mostrado se for um zero na frente ou no fim . (ponto) Localizao de separador decimal , (virgula) Localizao de separador de grupo ; (ponto e virgula) Separa formatos de nmeros positivos e negativos - (sinal de menos) Prefixo negativo % (percentual) Multiplica por 100 e mostra na forma percentual Qualquer outro smbolo Inclui o smbolo na string da sada
O mecanismo da classe DecimalFormat funciona bem para formatar nmeros que so valores monetrios.
Contudo, no adequado para notao cientfica, tabelas com colunas de largura fixa, ou nmeros em formato octal ou hexadecimal. Para essas aplicaes, pode-se usar a classe Format fornecida pelo livro Core Java 2 Volume I.
12. Instrues da classe Format
O livro Core Java 2 Volume I alm de oferecer uma classe Console para ler facilmente nmeros da tela, como tambm oferece uma classe que pode formatar nmeros com menos dificuldades que a classe NumberFormat.
Eles simplesmente refizeram a famosa funo printf da linguagem C que tem um bom conjunto de opes de formatao e , na maior parte, fcil de usar.
Por exemplo, para formatar um nmero de ponto flutuante com um tamanho de campo 10 e dois dgitos depois do separador decimal, podemos usar:
For mat . pr i nt f ( " Pagament o mensal %10. 2f \ n" , pagament o) ;
Se voc preferir colocar essa string numa varivel string, use:
St r i ng s = new For mat ( " Pagament o mensal %10. 2f \ n" ) . f or mat ( pagament o) ;
A string de sada contm todos os caracteres da string de formatao, exceto que a especificao de formato (comeando com um %) substituda pelo valor formatado. Por sua vez, %% representa um sinal de percentual.
Diferente do printf, s possvel um valor formatado de cada vez. Se for necessrio imprimir dois valores, use duas chamadas.
For mat . pr i nt f ( " Comt axa %6. 3f " , 100 * y) ; For mat . pr i nt f ( " %%, seu pagament o mensal %10. 2f \ n" , pagament o) ;
Deixando de lado o formato %m.nf, o mais comum %nd para imprimir um inteiro em um campo com tamanho n. Com esses dois j d pra fazer muita coisa e talvez voc nunca mais precise aprender cdigos de formatao!
Eis as regras dos especificadores de formatao. O cdigo comea com um % e termina com uma das letras c, d, e, E, f, g, G, i, o, s, x, X que tm o seguinte significado:
f - nmero de ponto flutuante em formato fixo e, E - nmero de ponto flutuante em notao exponencial (formato cientifico). O formato E resulta na letra E maiscula para o expoente (como em 1.14130E+003) e o formato e numa letra minscula e. g, G - nmero de ponto flutuante em formato gentico (formato fixo para nmeros pequenos, formato exponencial para nmero grandes). Os zeros finais so suprimidos. O formato G resulta numa letra E maiscula para o expoente (se algum) e o formato g na letra minscula g. d, i - inteiros em decimal. x, X - inteiros em hexadecimal (com a letra X em minscula ou maiscula). o - inteiros em octal. s - string c - caractere
Entre o % e o cdigo de formatao ficam os campos indicados a seguir. Eles todos so opcionais.
+ - fora a exibio de um +nos nmeros positivos 0 - mostra zeros iniciais. - - alinha o contedo do campo esquerda espao insere um espao na frente de nmeros positivos # - usa um formato alternativo; adiciona 0 ou 0x aos nmeros octais e hexadecimais respectivamente; no suprime os zeros finais no formato de ponto flutuante genrico.
13. Criando a classe
Crie uma classe com o mtodo main e com o nome TesteFormat.
Complete o cdigo de forma que ele fique idntico ao cdigo abaixo:
import cor ej ava. *;
public class Test eFor mat { public static void mai n( St r i ng[ ] ar gs) { double pagament o = 300. 00; / / I mpr i me 300. 00 For mat . pr i nt f ( " Pagament o mensal %10. 2f \ n" , pagament o) ; St r i ng s = new For mat ( " Pagament o mensal %3. 5f \ n" ) . f or mat ( pagament o) ; Syst em. out . pr i nt l n( " " ) ; Syst em. out . pr i nt l n( s) ; / / I mpr i me 300. 00000 } / / Fi mdo mt odo mai n } / / Fi mda cl asse Test eFor mat
Para que possa funcionar certifique-se de adicionar a linha abaixo:
import corejava.*;
14. Executando a classe TesteFormat
Clique no boto para executar a classe, e observe o resultado da execuo no console.