Formatando com printf () em Java
1. Introdução
In this tutorial, we’ll demonstrate different examples of formatting with the printf()method.
O método faz parte da classejava.io.PrintStream e fornece formatação de String semelhante à funçãoprintf() em C.
2. Sintaxe
Podemos usar um dos seguintes métodosPrintStream para formatar a saída:
System.out.printf(format, arguments);
System.out.printf(locale, format, arguments);
Especificamos as regras de formatação usando o parâmetroformat. As regras começam com o caractere‘%'.
Vejamos um exemplo rápido antes de nos aprofundarmos nos detalhes das várias regras de formatação:
System.out.printf("Hello %s!%n", "World");
Isso produz a seguinte saída:
Hello World!
Como mostrado acima, a string de formato contém texto sem formatação e duas regras de formatação. A primeira regra é usada para formatar o argumento da string. A segunda regra adiciona um caractere de nova linha ao final da string.
2.1. Regras de formato
Vamos dar uma olhada no formato de string mais de perto. Consiste em literais e especificadores de formato. Format specifiers include flags, width, precision, and conversion characters na seguinte sequência:
%[flags][width][.precision]conversion-character
Os especificadores entre parênteses são opcionais.
Internamente,printf() usa a classejava.util.Formatter para analisar a string de formato e gerar a saída. Opções adicionais de string de formato podem ser encontradas emFormatter Javadoc.
2.2. Personagens de conversão
The conversion-character is required and determines how the argument is formatted. Os caracteres de conversão são válidos apenas para determinados tipos de dados. Alguns comuns são:
-
s – formata strings
-
d - formata inteiros decimais
-
f - formata os números de ponto flutuante
-
t– formata valores de data / hora
Exploraremos esses e alguns outros posteriormente neste artigo.
2.3. Modificadores opcionais
The [flags] define standard ways to modify the outpute são mais comuns para formatar números inteiros e números de ponto flutuante.
The [width] specifies the field width for outputting the argument. Representa o número mínimo de caracteres gravados na saída.
The [.precision] specifies the number of digits of precision ao emitir valores de ponto flutuante. Além disso, podemos usá-lo para definir o comprimento de uma substring para extrair de umString.
3. Separador de linha
To break the string into separate lines, we have a %n specifier:
System.out.printf("example%nline%nterminator");
O trecho de código acima produzirá a seguinte saída:
example
line
terminator
The %n separator printf() will automatically insert the host system’s native line separator.
4. Formatação Booleana
To format boolean values, we use the %b format. Funciona da seguinte maneira: Se o valor de entrada fortrue, a saída serátrue. Caso contrário, a saída éfalse.
Então, se fizermos:
System.out.printf("%b%n", null);
System.out.printf("%B%n", false);
System.out.printf("%B%n", 5.3);
System.out.printf("%b%n", "random text");
Então veremos:
false
FALSE
TRUE
true
Observe que podemos usar%B para formatação em maiúsculas.
5. Formatação de String
To format a simple string, we’ll use the %s combination. Além disso, podemos colocar a string em maiúsculas:
printf("'%s' %n", "example");
printf("'%S' %n", "example");
E a saída é:
'example'
'example'
Além disso, para especificar um comprimento mínimo, podemos especificar umwidth:
printf("'%15s' %n", "example");
O que nos dá:
' example'
Se precisarmos justificar à esquerda nossa string, então podemos usar o ‘-‘ flag:
printf("'%-10s' %n", "example");
E a saída é:
'example '
Ainda mais, podemos limitar o número de caracteres em nossa saída especificando umprecision:
System.out.printf("%2.2s", "Hi there!");
O primeiro número‘x' na sintaxe%x.ys é o preenchimento. ‘y' é o número de caracteres.
Para nosso exemplo aqui, a saída éHi.
6. Formatação de Char
O resultado de%c é um caractere Unicode:
System.out.printf("%c%n", 's');
System.out.printf("%C%n", 's');
A letra maiúsculaC irá maiúsculas o resultado:
s
S
Mas, se dermos a ele um argumento inválido, entãoFormatter lançaráIllegalFormatConversionException.
7. Formatação de números
7.1. Formatação de Inteiro
O métodoprintf() aceita todos os inteiros disponíveis no idioma; byte, short, int, long eBigInteger se usarmos%d:
System.out.printf("simple integer: %d%n", 10000L);
Com a ajuda do caractere‘d', teremos:
simple integer: 10000
No caso de precisarmos deto format our number with the thousands separator, we can use the ‘,' flag. E também podemos formatar nossos resultados para diferentes localidades:
System.out.printf(Locale.US, "%,d %n", 10000);
System.out.printf(Locale.ITALY, "%,d %n", 10000);
Como vemos, a formatação nos EUA é diferente da Itália:
10,000
10.000
7.2. Formatação flutuante e dupla
Para formatar um número flutuante, precisaremos do formato 'f':
System.out.printf("%f%n", 5.1473);
Qual saída:
5.147300
Claro, a primeira coisa que vem à mente é controlar oprecision:
System.out.printf("'%5.2f'%n", 5.1473);
Aqui definimos owidth do nosso número como5, e o comprimento da parte decimal é2:
' 5.15'
Aqui, temos um preenchimento de espaço desde o início do número para suportar a largura predefinida.
Para ter nossa saídain scientific notation, we just use the ‘e' conversion character:
System.out.printf("'%5.2e'%n", 5.1473);
E o resultado é o seguinte:
'5.15e+00'
8. Formatação de data e hora
Para formatação de data e hora,the conversion string is a sequence of two characters: the ‘t' or ‘T' character and the conversion suffix. Vamos explorar os caracteres de sufixo de formatação de data e hora mais comuns com os exemplos.
Definitivamente, para uma formatação mais avançada, podemos usarDateTimeFormatter, que está disponível desde Java 8.
8.1. Formatação de hora
Primeiro, vamos ver a lista de alguns caracteres de sufixo úteis para Formatação de hora:
-
‘H', ‘M', ‘S' – characters are responsible for extracting the hours, minutes and second da entradaDate
-
‘L', ‘N' - para representar o tempo em milissegundos e nanossegundos de acordo
-
‘p' - adiciona a formatação am / pm
-
‘z' - imprime a diferença de fuso horário
Agora, digamos que queremos imprimir a parte do tempo de umDate:
Date date = new Date();
System.out.printf("%tT%n", date);
O código acima junto com a combinação de‘%tT' produz a seguinte saída:
13:51:15
Caso necessitemos de formatação mais detalhada, podemos solicitar segmentos de tempo diferentes:
System.out.printf("hours %tH: minutes %tM: seconds %tS%n", date, date, date);
Tendo usado‘H',‘M' e‘S', obtemos:
hours 13: minutes 51: seconds 15
Porém, listardate várias vezes é uma dor. Alternativamente,to get rid of multiple arguments, we can use the index reference of our input parameter which is 1$ in our case:
System.out.printf("%1$tH:%1$tM:%1$tS %1$tp %1$tL %1$tN %1$tz %n", date);
Aqui queremos como saída a hora atual, am / pm, a hora em milissegundos, nanossegundos e o deslocamento do fuso horário:
13:51:15 pm 061 061000000 +0400
8.2. Formatação de data
Assim como a formatação de hora, temos caracteres especiais para formatação de data:
-
‘A' - imprime o dia inteiro da semana
-
‘d' - formata um dia do mês com dois dígitos
-
‘B' - é para o nome completo do mês
-
‘m' - formata um mês de dois dígitos
-
‘Y' - produz um ano em quatro dígitos
-
‘y' - produz os dois últimos dígitos do ano
Então, se quisermos mostrar o dia da semana, seguido pelo mês:
System.out.printf("%1$tA, %1$tB %1$tY %n", date);
Então, usando‘A',‘B' e‘Y', obteríamos:
Thursday, November 2018
Para ter todos os resultados em formato numérico, podemos substituir as letras ‘A', ‘B', ‘Y’ por ‘d', ‘m', ‘y':
System.out.printf("%1$td.%1$tm.%1$ty %n", date);
O que resultará em:
22.11.18
9. Sumário
Neste artigo, discutimos como usar o métodoPrintStream#printf para formatar a saída. Examinamos os diferentes padrões de formato usados para controlar a saída para tipos de dados comuns.
Finalmente, como sempre, o código usado durante a discussão pode ser encontradoover on GitHub.