[RESOLVIDO] Realizar calculo com "ponto de milhar"

Bom dia,

Eu estou fazendo um programa que ao inserir um valor ele realiza um cálculo, mas eu queria que conforme eu fosse digitando o valor no JTextField fosse inserido os pontos que separa os milhares (ex: 1000 virar 1.000), e estou também utilizando um KeyListener para que o cálculo seja feito conforme eu insiro os valores.

Eu estou tentando fazer isso com o DecimalFormat, mas estou tendo um problema na hora de realizar o cálculo, parece que quando o primeiro ponto é inserido ele passa a considerar que esse número é fracionado.

Outro problema que está acontecendo é quando uso o Float, se eu tento fazer o cálculo com as variáveis sendo Float, depois que o valor chega em 1000 o ponto é inserido, após isso se eu tento acrescentar mais um número ele limpa todo o campo do JTextField, deixando apenas o primeiro número digitado á mostra.

Sem o DecimalFormat funciona normal, mas sem essa formatação com os pontos que eu queria.
Alguém pode me ajudar?

Desde já, agradeço!

Veja, o padrão português, que é o que seguimos, define que o ponto é separador de milhares, porém, o java não entende isso, ele segue o padrão inglês, onde o ponto é separador de decimais.
Sugestão: remova o ponto e leia apenas o número.

Mas não tem algum jeito de fazer essa separação por milhar funcionar sem atrapalhar o cálculo?

Você pode utilizar as classes DecimalFormat e DecimalFormatSymbols para facilitar o parsing da sua String e aí fazer o cálculo.

Eu não estava usando esse DecimalFormatSymbols, tentei implementar ele mas não sei se estou fazendo certo,vou colocar um pedaço do código aqui.

private float valor;
private float lucrox;
DecimalFormat df = new DecimalFormat("###,###,###,###,###");
DecimalFormatSymbols dfs = new DecimalFormatSymbols();

 private void precoKeyReleased(java.awt.event.KeyEvent evt) {                  
      
         dfs.setGroupingSeparator('.');
         df.setDecimalFormatSymbols(dfs);

         valor = Float.parseFloat(preco.getText()); 
         lucrox= valor-(valor*10)/100;

         lucro.setText(String.valueOf(df.format(lucrox))); 
         preco.setText(String.valueOf(df.format(valor))); 
    }                         

É desse jeito mesmo?

Campo formatado?? não é mais simples

Eu já tentei com as máscaras do campo formatado também, da o mesmo erro.
to até hoje quebrando a cabeça com isso kkkk.

Mas por que não consegue usar um JFormatterdText?

A máscara seria a seguinte para formatar milhar e 2 casas decimais:
",###.##"
Onde 123456789.88 seria formatado para 123.456.789,88 e vice-versa.
Só usando DecimalFormat

Então, o problema não é na hora de formatar os números
por exemplo, se eu tento setar uma String recebendo o valor, ela funciona a formatação:

String valorC= String.valueOf(df.format(valor));

O problema é quando eu tento passar essa formatação para o Campo de texto:

preco.setText(String.valueOf(df.format(valor)));

E esse erro ocorre tanto no campo de texto, quanto no campo formatado

Que erro exatamente? posta ele

Posta o código completo, só os pedaços não estão ajudando.

Dica: O método format retorna um objeto do tipo String, então não precisa fazer String.valueOf

Fiz uma versão reduzida do código para representar o problema:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import javax.swing.JOptionPane;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.NumberFormatter;


public class Teste {

    private static float valor;
    private static float lucrox;

    private static void Calcular() {
        //Create and set up the window.

        JFrame frame = new JFrame("Teste");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTextField preco = new JTextField();
        JTextField lucro = new JTextField();

        preco.addKeyListener(new KeyListener() {
            @Override

            public void keyTyped(KeyEvent e) {
            }

            @Override
            public void keyPressed(KeyEvent e) {
            }

            @Override
            public void keyReleased(KeyEvent e) {
                DecimalFormat df = new DecimalFormat("###,###,###,###,###");
                DecimalFormatSymbols dfs = new DecimalFormatSymbols();

                dfs.setGroupingSeparator('.');
                df.setDecimalFormatSymbols(dfs);
              
                valor = Float.parseFloat(preco.getText());
                lucrox = valor - (valor * 10) / 100;

                lucro.setText(String.valueOf(df.format(lucrox)));
                preco.setText(String.valueOf(df.format(valor)));
            }
        });

        Container c1 = frame.getContentPane();
        c1.setLayout(new BorderLayout());
        c1.add(preco, BorderLayout.NORTH);
        c1.add(lucro, BorderLayout.SOUTH);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Calcular();
            }
        });
    }
}

Tem vários problemas ai na verdade.

Vc está fazendo o cálculo com o valor parseado diretamente onde ele vai considerar o ponto como separador de decimal. Se vc usa os formatadores pra exibir o valor tbm deve usa-los para DESFORMATAR.
Altera para:
valor = df.parse(preco.getText()).floatValue(); //precisa try/catch

1 curtida

Muito obrigado!
Funcionou certinho, já estava a um tempo tentando resolver isso!