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 StringBuilder para 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

  1. Lemos as três entradas: nome, preço e quantidade. Convertemos preço e quantidade para os tipos numéricos.
  2. Calculamos total = preco * quantidade.
  3. Criamos o cabeçalho com um text block; a quebra de linha já está inclusa.
  4. Instanciamos um StringBuilder e adicionamos as linhas com append. Usamos String.format("%.2f", ...) para duas casas decimais.
  5. Criamos o rodapé com outro text block.
  6. 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). Use parseDouble com ponto.
  • Não formatar o total: sairia 10.0 em vez de 10,00.
  • Usar + para concatenar no laço: aqui são poucas linhas, mas em relatórios grandes o StringBuilder é 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
=====================