Menu

Formatação de strings em Java: String.format, printf e especificadores de formato

Como formatar strings em Java com String.format e printf - os especificadores de formato para números, preenchimento, casas decimais, além dos text blocks e do método formatted.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

Duas maneiras de formatar

Java formata strings a partir de um template que contém especificadores de formato (os marcadores %) mais os valores a serem inseridos. Há dois pontos de entrada, e eles compartilham uma sintaxe idêntica:

  • String.format(template, values...) retorna uma nova String.
  • System.out.printf(template, values...) imprime o resultado diretamente.

Ambos produzem o mesmo texto. String.format o devolve para que você possa armazená-lo; printf o escreve no console. Repare no %n no fim do template do printf - essa é a quebra de linha independente de plataforma (prefira-a a \n em strings de formato).

Os especificadores mais comuns

Cada especificador começa com % e termina com uma letra que indica que tipo de valor é esperado:

Os três do dia a dia são %s (qualquer valor, via seu toString), %d (números inteiros) e %f (decimais). Use %% para imprimir um sinal de porcentagem literal. Passar o tipo errado - digamos, uma String para %d - lança uma IllegalFormatConversionException em tempo de execução.

Controlando as casas decimais

%f usa por padrão seis casas decimais, o que raramente é o que você quer. Coloque .N antes do f para fixar a precisão (o valor é arredondado):

Adicione o sinalizador de vírgula para os separadores de agrupamento em números grandes:

Largura e preenchimento

Um número entre o % e a letra do tipo define uma largura mínima de campo, preenchendo com espaços para que as colunas fiquem alinhadas. Um - inicial alinha à esquerda; um 0 inicial preenche os números com zeros:

É isso que torna legíveis as tabelas formatadas e os relatórios alinhados:

O %-8s alinha os nomes à esquerda em uma coluna de 8 de largura e %5d alinha as pontuações à direita em uma coluna de 5 de largura, de modo que os números ficam alinhados independentemente da quantidade de dígitos.

Ordem dos argumentos

Por padrão, os especificadores consomem os valores da esquerda para a direita. Você pode repetir ou reordenar um valor com N$ (índice começando em um), útil quando o mesmo valor aparece duas vezes:

%1$s se refere ao primeiro argumento nas duas vezes, então echo é impresso duas vezes.

O método formatted()

Desde o Java 15, toda string tem um método de instância formatted - o mesmo motor do String.format, apenas escrito como uma chamada de método sobre o template:

Ele combina especialmente bem com os text blocks (strings de várias linhas com aspas triplas) ao montar saídas formatadas maiores.

Quando não usar String.format

Para junções simples e pontuais, a concatenação comum com + é mais clara e rápida:

String greeting = "Hi, " + name + "!";   // simpler than String.format here

Recorra a String.format / printf quando precisar de formatação de verdade - casas decimais fixas, preenchimento, alinhamento, agrupamento - e não apenas colar alguns valores.

A seguir: Operadores

A formatação transforma valores em texto. Para calcular esses valores em primeiro lugar, você precisa dos operadores do Java - aritméticos, de comparação e lógicos. Essa é a próxima página.

Perguntas frequentes

Como você formata uma string em Java?

Use String.format(template, values...), que retorna uma nova string com cada especificador de formato substituído por um valor: String.format("%s is %d", name, age). Para imprimir diretamente em vez de montar uma string, use System.out.printf(...) com o mesmo template. Desde o Java 15 você também pode chamar template.formatted(values...).

Como você formata um número com duas casas decimais em Java?

Use o especificador %.2f: String.format("%.2f", 3.14159) produz "3.14". O número depois do ponto indica quantas casas decimais manter, e o valor é arredondado. Para separadores de milhar, adicione o sinalizador de vírgula: %,.2f resulta em "1,234.57".

Qual é a diferença entre String.format e printf em Java?

Eles usam exatamente os mesmos especificadores de formato. String.format(...) retorna o texto formatado como uma nova String que você pode armazenar ou repassar. System.out.printf(...) escreve o texto formatado direto na saída padrão e não retorna nada útil. Use String.format para montar uma string e printf para imprimir uma.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR