Desafio Java
Relatório formatado com text block e StringBuilder
Enunciado
Leia três linhas: nome do produto, preço unitário e quantidade. Calcule o total e gere um relatório formatado usando um text block para o cabeçalho e StringBuilder para montar as linhas de dados. Formate o preço com duas casas decimais usando String.format.
Requisitos
- Ler nome, preço e quantidade com
Scanner. - Calcular
total = preco * quantidade. - Usar um text block para o cabeçalho do relatório.
- Usar
StringBuilderpara montar a linha de dados. - Formatar valores monetários com
String.format("%.2f", valor).
Código inicial
import java.util.Scanner;
public class Relatorio {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String nome = sc.nextLine();
double preco = Double.parseDouble(sc.nextLine());
int quantidade = Integer.parseInt(sc.nextLine());
// Seu código aqui
}
}
Saída esperada
===== RELATÓRIO =====
Produto: Caneta
Preço unitário: R$ 2,50
Quantidade: 4
Total: R$ 10,00
=====================
Ver dica
Use String.format("%.2f", preco) para formatar. O text block pode conter o cabeçalho e o rodapé; o StringBuilder monta as linhas do meio.
Mostrar solução
import java.util.Scanner;
public class Relatorio {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String nome = sc.nextLine();
double preco = Double.parseDouble(sc.nextLine());
int quantidade = Integer.parseInt(sc.nextLine());
double total = preco * quantidade;
// Cabeçalho com text block
String cabecalho = """
===== RELATÓRIO =====
""";
// Linhas de dados com StringBuilder
StringBuilder sb = new StringBuilder();
sb.append("Produto: ").append(nome).append('\n');
sb.append("Preço unitário: R$ ").append(String.format("%.2f", preco)).append('\n');
sb.append("Quantidade: ").append(quantidade).append('\n');
sb.append("Total: R$ ").append(String.format("%.2f", total)).append('\n');
// Rodapé com text block
String rodape = """
=====================""";
System.out.print(cabecalho + sb.toString() + rodape);
}
}
Passo a passo
- Lemos as três entradas: nome, preço e quantidade. Convertemos preço e quantidade para os tipos numéricos.
- Calculamos
total = preco * quantidade. - Criamos o cabeçalho com um text block; a quebra de linha já está inclusa.
- Instanciamos um
StringBuildere adicionamos as linhas comappend. UsamosString.format("%.2f", ...)para duas casas decimais. - Criamos o rodapé com outro text block.
- Imprimimos tudo concatenando
cabecalho + sb.toString() + rodape.
Por que funciona
O text block permite escrever o cabeçalho e o rodapé sem \n explícitos, deixando o código legível. O StringBuilder evita criar várias strings intermediárias ao montar as linhas dinâmicas. A formatação com String.format garante a apresentação monetária correta.
Erros comuns
- Esquecer de converter preço com
Double.parseDouble:nextDouble()pode ter problemas com localidade (vírgula vs ponto). UseparseDoublecom ponto. - Não formatar o total: sairia
10.0em vez de10,00. - Usar
+para concatenar no laço: aqui são poucas linhas, mas em relatórios grandes oStringBuilderé essencial. - Indentação do text block: o Java remove a indentação comum; cuidado para não deixar espaços indesejados.
Outra forma de resolver
Usar String.format com um único text block formatado:
String relatorio = """
===== RELATÓRIO =====
Produto: %s
Preço unitário: R$ %.2f
Quantidade: %d
Total: R$ %.2f
=====================""".formatted(nome, preco, quantidade, total);
System.out.println(relatorio);
Essa alternativa é mais concisa, mas perde a flexibilidade do StringBuilder para adicionar linhas condicionalmente.
Saída esperada
===== RELATÓRIO =====
Produto: Caneta
Preço unitário: R$ 2,50
Quantidade: 4
Total: R$ 10,00
=====================