1. O problema da concatenação manual
Se você precisa exibir uma ou duas variáveis, o operador + é realmente conveniente. Mas quando há muitos dados, a concatenação rapidamente vira caos, especialmente se for necessário formatar números (por exemplo, 2 casas decimais) ou quebras de linha.
String name = "Oleg";
int age = 25;
double balance = 12345.67;
System.out.println("Nome: " + name + ", idade: " + age + ", saldo: " + balance + " euros.");
Tentar “aprimorar” a formatação dentro da concatenação só piora a legibilidade:
System.out.println("Nome: " + name + ", idade: " + age + ", saldo: " + String.format("%.2f", balance) + " euros.");
Conclusão: concatenação simples é boa para coisas pequenas, mas para mensagens complexas é preciso uma ferramenta mais poderosa — String.format().
2. String.format — formatando strings de forma profissional
O método String.format() permite criar uma string a partir de um modelo e inserir valores em posições determinadas.
Forma geral:
String result = String.format("Modelo", znacheniya);
- %s — string
- %d — inteiro
- %f — número de ponto flutuante
- %n — quebra de linha (multiplataforma)
String name = "Oleg";
int age = 25;
double balance = 12345.6789;
String info = String.format("Nome: %s, idade: %d, saldo: %.2f euros.", name, age, balance);
System.out.println(info);
// Saída: Nome: Oleg, idade: 25, saldo: 12345.68 euros.
String result = String.format("Nome: %s, idade: %d, saldo: %.2f euros", name, age, balance);
// %s — string, %d — inteiro, %.2f — número com 2 casas decimais
Formatação de números e strings
Números fracionários com precisão fixa:
double price = 99.999;
System.out.println(String.format("Preço: %.2f euros.", price)); // Preço: 100.00 euros.
Largura do campo e alinhamento:
int n = 7;
System.out.println(String.format("Número: [%5d]", n)); // Número: [ 7]
System.out.println(String.format("Número: [%-5d]", n)); // Número: [7 ]
[5d] — largura do campo 5, alinhamento à direita por padrão;
[-5d] — largura do campo 5, alinhamento à esquerda.
Strings com alinhamento:
String text = "Java";
System.out.println(String.format("[%10s]", text)); // [ Java]
System.out.println(String.format("[%-10s]", text)); // [Java ]
Porcentagens:
double percent = 0.125;
System.out.println(String.format("Concluído: %.1f%%", percent * 100)); // Concluído: 12.5%
Para imprimir o símbolo de porcentagem, use %%.
Formatação de datas (breve)
import java.util.Date;
Date now = new Date();
System.out.println(String.format("Hoje: %tD", now)); // Hoje: 06/18/24
System.out.println(String.format("Hora: %tT", now)); // Hora: 15:42:07
Localização e separadores
Por padrão, usa-se a localidade do sistema. Para definir a sua (por exemplo, vírgula como separador decimal), passe a localidade — por exemplo, Locale.FRANCE.
import java.util.Locale;
double price = 1234.56;
System.out.println(String.format(Locale.FRANCE, "%.2f", price)); // 1234,56
Exemplos práticos
Exemplo 1: Relatório curto
String name = "Anna";
int tasks = 5;
double hours = 12.3456;
String report = String.format(
"Funcionário: %s%nTarefas concluídas: %d%nHoras gastas: %.1f",
name, tasks, hours
);
System.out.println(report);
/* Saída:
Funcionário: Anna
Tarefas concluídas: 5
Horas gastas: 12.3
*/
Exemplo 2: Tabela com alinhamento
String header = String.format("%-10s | %5s | %8s", "Nome", "Pontos", "Tempo");
String row1 = String.format("%-10s | %5d | %8.2f", "Oleg", 95, 10.5);
String row2 = String.format("%-10s | %5d | %8.2f", "Anna", 100, 9.75);
System.out.println(header);
System.out.println(row1);
System.out.println(row2);
/* Saída:
Nome | Pontos | Tempo
Oleg | 95 | 10.50
Anna | 100 | 9.75
*/
Exemplo 3: Texto misto
int apples = 12;
int pears = 8;
System.out.println(String.format("Eu tenho %d maçãs e %d peras.", apples, pears));
3. Prática: formatação de strings no nosso aplicativo
Vamos adicionar formatação ao aplicativo de console: saldo sempre com duas casas decimais, quebras de linha via %n.
Scanner console = new Scanner(System.in);
System.out.print("Digite o nome: ");
String name = console.nextLine();
System.out.print("Digite a idade: ");
int age = console.nextInt();
System.out.print("Digite o saldo: ");
double balance = console.nextDouble();
// Saída formatada
String info = String.format("Nome: %s, idade: %d, saldo: %.2f euros.", name, age, balance);
System.out.println(info);
Tente:
- Inserir valores diferentes e verificar que o saldo sempre é exibido com duas casas decimais (%.2f).
- Alterar o modelo para adicionar quebras de linha usando %n.
4. Erros comuns ao formatar strings
Erro nº 1: Incompatibilidade entre tipos e marcadores.
Não é possível passar uma string para %d ou um número para %s.
String.format("Idade: %d", "vinte"); // Erro: era esperado um número, foi passada uma string
Erro nº 2: Ordem dos argumentos trocada.
O modelo %s %d, mas você passou primeiro um número e depois uma string — isso causará erro ou saída incorreta.
Erro nº 3: Ignorar a localidade.
Esperava vírgula como separador decimal, mas viu ponto — defina a localidade desejada explicitamente pelo primeiro parâmetro de String.format(...).
Erro nº 4: Símbolo de porcentagem sem escape.
Para imprimir o símbolo %, use %%; caso contrário, a formatação falhará com erro.
GO TO FULL VERSION