CodeGym /Cursos /JAVA 25 SELF /Formatação de strings

Formatação de strings

JAVA 25 SELF
Nível 9 , Lição 2
Disponível

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.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION