Calculando e exibindo no label

6 respostas
C

Boa tarde,

Eu possuo um textfield aonde são inseridos valores monetários, e conforme eu ia clicando no botao adicionar gostaria que fosse aparecendo o total (contador) em um textfield, o sistema funciona porém após alguns cálculos ele aparece com várias casas decimais, gostaria de saber o porque disso sendo que todos os números inseridos são sempre com duas casas decimais e se possível como limitar a aparecer somente duas…

String total = fmt_valorCheque.getText().replace(",", "."); // Como se trata de dinheiro tive que substituir a , por . para efetuar a operação;
        lbl_total.setText(""+ (Double.parseDouble(total)+Double.parseDouble(lbl_total.getText())));

Aproveitando, teria como exibir o total em um textfield? tentei mas não consegui.

Espero ter conseguido me expressar…

[]'s

6 Respostas

T

Para exibir o total em um JTextField a rotina é exatamente a mesma (setText), então não entendi qual a sua dificuldade.

De qualquer maneira, para mostrar o número adequado de casas decimais, você pode usar String.format (mais fácil) ou java.text.NumberFormat (mais chato). Para efetuar a conversão, é melhor usar o método adequado, que é NumberFormat .parse. Vou dar um exemplo.

double valorCheque, valorTotal;
NumberFormat nf = NumberFormat.getCurrencyInstance (); // formato de moeda
valorCheque = nf.parse (fmt_valorCheque.getText()).doubleValue();
valorTotal = nf.parse (lbl_total.getText()).doubleValue();
valorTotal = valorTotal + valorCheque;
lbl_total.setText (nf.format (valorTotal)); // formata o valor em formato de moeda
C

Olá, testei o código que me passou e obtive o seguinte erro:

<blockquote>16/04/2009 14:18:19 cadastros.CadastroClientes setTotal

SEVERE: null

java.text.ParseException: Unparseable number: "33,43"

at java.text.NumberFormat.parse(NumberFormat.java:309)

at cadastros.CadastroClientes.setTotal(CadastroClientes.java:313)

at cadastros.CadastroClientes.btn_addActionPerformed(CadastroClientes.java:238)

at cadastros.CadastroClientes.access$200(CadastroClientes.java:22)

at cadastros.CadastroClientes$4.actionPerformed(CadastroClientes.java:120)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)

at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)

at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)

at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)

at java.awt.Component.processMouseEvent(Component.java:5517)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3135)

at java.awt.Component.processEvent(Component.java:5282)

at java.awt.Container.processEvent(Container.java:1966)

at java.awt.Component.dispatchEventImpl(Component.java:3984)

at java.awt.Container.dispatchEventImpl(Container.java:2024)

at java.awt.Component.dispatchEvent(Component.java:3819)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)

at java.awt.Container.dispatchEventImpl(Container.java:2010)

at java.awt.Window.dispatchEventImpl(Window.java:1791)

at java.awt.Component.dispatchEvent(Component.java:3819)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)

at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

</blockquote>

O fmt_valorCheque já vem formatado com , para decimais e . para milhares, entao quando tenho por exemplo o número 1.204,00 ele fica com várias casas decimais nao somente 2.

T

Tá bom, esqueci que getCurrencyInstance requer que você ponha o símbolo de real (R$) na entrada, como “R$ 33,69”). Altere o seu programa para:

NumberFormat nf = new DecimalFormat ("0.00", new DecimalFormatSymbols (new Locale ("pt", "BR"))); // formato de moeda, sem o sinal R$

As outras linhas são iguais.

C

Funcionou quase 100% agora ele da erro em números com milhares, acho que é por causa do ponto, por exemplo 2.222,22 ficou apenas 2,00... se eu remover o ponto funcionaria né!?

--- edit ---

Fiz assim e funcionou... o número no label ficara sem o ponto no milhar mas não é algo de extrema necessidade...
Obrigado!!!

total = fmt_valorCheque.getText().replace(".", "");
        double valorCheque = 0, valorTotal = 0;  
        NumberFormat nf = new DecimalFormat ("0.00", new DecimalFormatSymbols (new Locale ("pt", "BR"))); // formato de moeda, sem o sinal R$    
        try {
            // formato de moeda, sem o sinal R$
            valorCheque = nf.parse(total).doubleValue();
            valorTotal = nf.parse(lbl_total.getText()).doubleValue(); 
        } catch (ParseException ex) {
            Logger.getLogger(CadastroClientes.class.getName()).log(Level.SEVERE, null, ex);
        }
         
        valorTotal = valorTotal + valorCheque;  
        lbl_total.setText (nf.format (valorTotal)); // formata o valor em formato de moeda
T

Se quiser formatar números com milhares, use “#,##0.00” em vez de “0.00” como lhe sugeri.

C

Agora sim está tudo perfeito, e quanto ao textfield, funcionou normalmente, também não sei oque estava acontecendo que não estava funcionando…

Muito obrigado pela atenção e pela paciência!!!

Criado 16 de abril de 2009
Ultima resposta 16 de abr. de 2009
Respostas 6
Participantes 2