Formatando com printf () em Java

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:

  • – 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.