Como formatar uma string de caracteres?
Existe um método para isso.
Question
Como formatar uma string de caracteres?
Less Short Answer
Na verdade, existem várias soluções oferecidas pelo JDK, mas a mais simples é provavelmente o método de fábrica format da classe String. Ele recebe um formato como primeiro argumento, seguido pelos objetos que você quer passar para esse formato, para que sejam renderizados na string final.
javaString message = String.format("%s scored %d points", "Ana", 92);
// message = "Ana scored 92 points"Inspired by C's `printf`
Essa sintaxe de formato é inspirada no (in)famoso formato usado pela função printf do C — aquele que todo mundo conhece, ou pelo menos já esbarrou em algum momento. Está totalmente descrito no Javadoc da classe Formatter, que é o motor por trás de String.format, PrintStream.printf e PrintWriter.printf.
Existem, no entanto, diferenças entre o printf do C e o Formatter do Java:
- Erros não são tratados da mesma forma. O
printfdo C confia na string de formato e lê a memória de acordo com ela, independentemente do que foi realmente passado — uma incompatibilidade pode corromper silenciosamente a saída ou travar o programa. OFormatterdo Java verifica o tipo de cada argumento contra seu especificador e lançaIllegalFormatConversionExceptionem caso de incompatibilidade. - Algumas personalizações foram feitas em cima da sintaxe original do C — por exemplo, o índice de argumento
n$e o separador de linha independente de plataforma%nnão têm equivalente noprintfdo C.
Practical Example
javaSystem.out.printf("%-10s | %5.2f%n", "Total", 42.5); // escreve direto no System.out
String s = String.format("%-10s | %5.2f", "Total", 42.5); // mesma renderização, retornada como StringOne Last Word: Thread Safety
Formatar strings pode te tentar a compartilhar uma instância de Formatter pra economizar recursos — mas cuidado: um Formatter carrega estado interno mutável (seu buffer de saída), então compartilhar um entre threads não é seguro. String.format e printf nunca caem nesse problema porque cada chamada cria seu próprio Formatter privado internamente.