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
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
Olá, testei o código que me passou e obtive o seguinte erro:
[quote]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)
[/quote]
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á 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.
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!!!
[code]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 [/code]
Se quiser formatar números com milhares, use “#,##0.00” em vez de “0.00” como lhe sugeri.
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!!!