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 novaString.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.