Formatação de moeda para salvar no banco de dados como DECIMAL

Galera estou criando uma aplicação e estou querendo que quando o usuário digite o salario do funcionário
ex: 315487 mas quando fosse pro banco ficasse ex: 3.154,87, e em outro caso estou fazendo uma multiplicação da quantidade de produtos vezes o valor unitário de cada produto
exe: qtd = 20; valorUnitario = 599.99; valorTotal = qtd * valorUnitario;

Quando estou enviando pro banco fica assim valorTotal = 11999.8. queria que ficasse com as casas decimais certinha tipo valorTotal = 11.999,8.

Alguem pode me ajudar como resolver este problema?
minha aplicação é usando o JavaFX e o Banco de Dados é o PostGresql.

Boa noite Gabriel.

Tente usar o DecimalFormat:

DecimalFormat df = new DecimalFormat(",000.00");
‘o seu código para enviar para o BD’ = (df.format(suavariavelcomovalor));

Lembrando que o formato no código realmente é com , e para centavos . por que o Java inverte na execução.

Lembrando que se depois quiser manipular o valor pegando-o do BD deve usar o .replace(".","").replace(",",".")
Para tirar o ponto e transformar a virgula em ponto, pois se não o JAVA não vai reconhecer como float/double.

Qualquer dúvida é so postar,

Está correto dessa forma, a formatação não se armazena em banco de dados, armazenar dados formatados é uma má prática, formatação de dados se faz na aplicação somente pra apresentar para o usuário de uma forma mais amigável.

2 curtidas

boa noite Alencar, gostaria de saber onde implemento essa função replace para puxar os dados do meu DB e jogar na minha tabela na interface com os dados formatados.

abaixo está o código de como eu estou puxando os dados do DB.

public ArrayList<Produto> Listar(){
        conex.Conectar();
        conex.rs = null;
        
        ArrayList<Produto> produtos = new ArrayList<>();
        
        try {
            PreparedStatement stmt = conex.con.prepareStatement("select * from produtos");
            conex.rs = stmt.executeQuery();
            while(conex.rs.next()){
                Produto produto = new Produto();
                produto.setIdP(conex.rs.getInt("id"));
                produto.setDescricao(conex.rs.getString("descricao"));
                produto.setCategoria(conex.rs.getString("categoria"));
                produto.setUnidade(conex.rs.getString("unidade"));
                produto.setQuantidade(conex.rs.getInt("quantidade"));
                produto.setValorUnd(conex.rs.getDouble("valorund"));
                produto.setValorTotal(conex.rs.getDouble("valortotal"));
                
                produtos.add(produto);
            }
            
        } catch (SQLException ex) {
            Logger.getLogger(ClienteDAO.class.getName()).log(Level.SEVERE, null, ex);
        }finally{
            conex.Desconectar();
        }
        
        
        
        return produtos;
    }

Conseguir Resolver usando o objeto NumberFormat. em baixo esta o codigo de como eu utilizei.

 PreparedStatement stmt = conex.con.prepareStatement("select * from produtos");
            conex.rs = stmt.executeQuery();
            while(conex.rs.next()){
                Produto produto = new Produto();
                
                NumberFormat nf = NumberFormat.getInstance();
                
                produto.setIdP(conex.rs.getInt("id"));
                produto.setDescricao(conex.rs.getString("descricao"));
                produto.setCategoria(conex.rs.getString("categoria"));
                produto.setUnidade(conex.rs.getString("unidade"));
                produto.setQuantidade(conex.rs.getInt("quantidade"));
                produto.setValorUnd(conex.rs.getDouble("valorund"));
                produto.setValorTotal(String.valueOf(nf.format(conex.rs.getDouble("valortotal"))));
                
                produtos.add(produto);

Ótimo. Mas respondendo a sua pergunta:
DecimalFormat df = new DecimalFormat(",000.00");
pst.setString(“1”,df.format(suavariavelcomovalor)); // Implementa na hora de mandar pro BD.

Mas como o colega Jonathan falou isso vai dar mais trabalho quando for buscar o valor no BD. O certo é deixar sem formatar no BD e formatar só quando for imprimir na tela.
Lhe ensinei desse modo apenas para que você pudesse sanar sua dúvida. Forte abraço!