Formatação Moeda

17 respostas
marciofermino

Amigos fiz o codigo para pegar uma valor digitado pelo usuário: ex. 1.234,10 e poder realizar calculos
ate ai esta funcionando…

com esse codigo… eu consigo mostrar na tela R$ 1.234,10 e tb tenho valor 1234.1 para poder armazenar no banco MySQL

a pergunta… é facil e sei que é possivel.

só que meus conhecimentos são poucos.

como eu poderia pegar esse código abaixo…e talvez falar uma classe para poder reaproveitar??

Pq toda vez que tenho que transformar valores ( para apresentação ao usuário e pegar valor para o MySQL tenho que ficar colando esse código)
em java sei que isso não é o certo… melhor em linguagem nenhuma.

Se algúem puder ajudar com explicação ou poder até mecher no código agradeçõ. como disse meu conhecimento é pequeno.

Locale l = new Locale("pt", "BR");
        NumberFormat nf = NumberFormat.getCurrencyInstance(l);






        String valor1 = "";
        String valor2 = "";


        Number numero1;
        Number numero2;

        try {

            // ate aqui eu so preparei para receber os numeros
            // 
            valor1 = "R$ " + (String) jMoneyField1.getText();
            valor2 = "R$ " + (String) jMoneyField2.getText();

            numero1 = nf.parse(valor1);
            numero2 = nf.parse(valor2);






            // aqui o cálculo a ser realizado 
            double resultado = numero1.doubleValue() - numero2.doubleValue();




            
            // SAIDA PARA JTEXTFIELD
            jTextField1.setText("O novo valor é: " + nf.format(resultado)); // aqui formata o resultado
            jTextField2.setText(String.valueOf(resultado));   // aqui sem o formato ( padrao internacional )



        } catch (ParseException e) {

            e.printStackTrace();
        }

17 Respostas

marciofermino

.

LPJava

se vc colocasse os valores em um arquivo e no BD vc carregasse esse dados ?

dreampeppers99

marciofermino:
Amigos fiz o codigo para pegar uma valor digitado pelo usuário: ex. 1.234,10 e poder realizar calculos
ate ai esta funcionando…

com esse codigo… eu consigo mostrar na tela R$ 1.234,10 e tb tenho valor 1234.1 para poder armazenar no banco MySQL

a pergunta… é facil e sei que é possivel.

só que meus conhecimentos são poucos.

como eu poderia pegar esse código abaixo…e talvez falar uma classe para poder reaproveitar??

Você pode criar uma Classe chamada dinheiro {Ver Money - Analisys Pattern - FOWLER, Martin} com dois atributos:
-moeda
-montante

Sendo que moeda irá receber qual moeda se trata: “BR” ,“US”, “JP” … e o montante, aconselho a não usar double nem float prefira BigDecimal ou algum inteiro (int, long) parar representar o montante. {pode até dar uma interface fluente para a mesma}

Dinheiro doisReais = new Dinheiro(200L,REAL); //talvez enums para DOLLAR, EURO...
Dinheiro tresReais = new Dinheiro(300L,REAL);
Dinheiro cincoReais = doisReais.mais(tresReais);
System.out.println(cincoReais); //sobrescreva o toString()
Assert(cincoReais.maiorQue(tresReais));

Só deixar a imaginação fluir, dê uma olhadinha já se tem uma mini-framework para Dinheiro em Java.
{http://timeandmoney.sourceforge.net/}
Para dar mais inteligência, crie alguns métodos para a Classe e sobrescreva alguns outros pronto.

Sua classe Dinheiro pode ser usada agora em outros projetos…
Talvez o único problema será tentar alocar-la num local diferente do domínio. {já que o conceito de Dinheiro é comum para vários sistemas} Alguns autores dizem que esta classe deveria estar na base das plataformas.
Uma lida abaixo pode ajudar a entender.
http://fragmental.tw/2008/02/06/superstars-in-your-domain-model/

marciofermino:

Pq toda vez que tenho que transformar valores ( para apresentação ao usuário e pegar valor para o MySQL tenho que ficar colando esse código)
em java sei que isso não é o certo… melhor em linguagem nenhuma.
Se algúem puder ajudar com explicação ou poder até mecher no código agradeçõ. como disse meu conhecimento é pequeno.

Ao invés de colar o código use a classe Dinheiro.

RenataFA

Aqui fazemos diferente... usamos um FormatterFactory para valores monetários. Desta forma vc não precisa fazer muita coisa, sempre será apresentado o valor de forma correta pro usuário, e sempre vc poderá tb pegar o valor correto pra gravar no BD (seu MySQL).

Vamos a um ex, suponhamos que eu tenha um JFormattedTextField chamado ftf. Então eu programo ele da seguinte forma:

Formatador meuFormatador = new Formatador();

JFormattedTextField ftf = new javax.swing.JFormattedTextField();
ftf.setHorizontalAlignment(javax.swing.JTextField.RIGHT); // quero que fique alinhado a direita
ftf.setPreferredSize(new java.awt.Dimension(80, 19)); // quero este tamanho de caixa de texto
ftf.setFormatterFactory(meuFormatador.formataMonetario(5,2));
ftf.setValue(new BigDecimal("0.00"));

Um trecho da classe Formatador:

public class Formatador{
    
	public Formatador(){}
	
	public DefaultFormatterFactory formataMonetario(int inteiros, int decimais){
		NumberFormat nf = NumberFormat.getCurrencyInstance(meuLocale); // meuLocale é do tipo Locale, como vc criou no seu ex.
		NumberFormat nfEdit = NumberFormat.getNumberInstance(meuLocale);
		nf.setMinimumIntegerDigits(1);
		nf.setMaximumIntegerDigits(inteiros);
		nf.setMinimumFractionDigits(decimais);
		nf.setMaximumFractionDigits(decimais);
		nfEdit.setMinimumIntegerDigits(0);
		nfEdit.setMaximumIntegerDigits(inteiros);
		nfEdit.setMinimumFractionDigits(decimais);
		nfEdit.setMaximumFractionDigits(decimais);
		
		return new DefaultFormatterFactory(new NumberFormatter(nf), new NumberFormatter(nf), new NumberFormatter(nfEdit));
	}
}
O usuário vai digitar no campo normalmente, vc, dentro do fonte, qdo for acessar um valor vc usará:
ftf.getValue(); // isso vai te retornar um BigDecimal

E qdo for colocar algum valor no JFormattedTextField, vc faz assim:

ftf.setValue(new BigDecimal("12.00")); // sempre coloque um BigDecimal dentro dele, pra que qdo vc for pegar, tenha sempre um BigDecimal

Espero ter ajudado! :wink:

marciofermino

renata… vc tem razao, e ajudou bastante …
deixa eu explicar sou desenvolvedor… mais para java web… desktop esta sendo novidade

viu notei que o jTextFormat;; existem sim a propriepdade formatfactory… entao fui la e configurei para o formato moeda
vc tem razao… o usuario sempre ira ver o valor formatado…

mais como eu poderia agora… somar + 100 este jtextFormat

float n1 = Float.parseFloat((String) jFormattedTextField1.getText());
// agora quer somar + 100

RenataFA

Como o amigo já disse, não use Float, use BigDecimal. Veja na API sobre este tipo e vai aprender mais sobre métodos possíveis de ser usado no seu caso.

Isso soma 100 no valor do JFormattedTextField e acumula o resultado a uma variável:

BigDecimal valor = ((BigDecimal)text.getValue()).add(new BigDecimal(100));
marciofermino

renata. vc tem ajudado muito e estou quase la

so que fiz mais o joption nao mostrou o resultado

BigDecimal valor = ((BigDecimal) jFormattedTextField1.getValue()).add(new BigDecimal(100)); JOptionPane.showMessageDialog(null, valor);

o erro

init:
deps-jar:
Compiling 1 source file to C:\X\teste\build\classes
compile:
run:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.Long cannot be cast to java.math.BigDecimal
        at teste.tela2.jButton1ActionPerformed(tela2.java:75)
        at teste.tela2.access$000(tela2.java:7)
        at teste.tela2$1.actionPerformed(tela2.java:34)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6038)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5803)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Component.dispatchEventImpl(Component.java:4410)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
        at java.awt.Container.dispatchEventImpl(Container.java:2102)
        at java.awt.Window.dispatchEventImpl(Window.java:2429)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
RenataFA

É, parece que vc não deu uma olhada na API sobre BigDecimal como eu falei né? Bom, lembre-se disso, pra aprender tem que ler MUITO a API, ela é seu guia, seu manual. Bom, tenta assim:

JOptionPane.showMessageDialog(null, valor.toPlainString());
marciofermino

puxa… desculpe renata…
estou lendo… aqui API

mais ainda nao deu… nossa parece que desktop é mais complicado que java pra web

BigDecimal valor = ((BigDecimal) jFormattedTextField1.getValue()).add(new BigDecimal(100));
JOptionPane.showMessageDialog(null, valor.toPlainString());

marciofermino

amigos ta faltando pouco e to ficando maluco …rsss

BigDecimal valor = ((BigDecimal) jFormattedTextField1.getValue()).add(new BigDecimal(100)); String bigDecString = valor.toString(); JOptionPane.showMessageDialog(null,bigDecString);

o erro

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.Long cannot be cast to java.math.BigDecimal
        at teste.tela2.jButton1ActionPerformed(tela2.java:73)
        at teste.tela2.access$000(tela2.java:7)
        at teste.tela2$1.actionPerformed(tela2.java:34)

Vou colocar como configurei o jFormattedTextField


RenataFA

Vc postou o erro:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.Long cannot be cast to java.math.BigDecimal at teste.tela2.jButton1ActionPerformed(tela2.java:73) at teste.tela2.access$000(tela2.java:7) at teste.tela2$1.actionPerformed(tela2.java:34)

Agora me diga, o que está na linha 73 da sua tela2.java?

Me mostra o código fonte, essas telinhas da IDE normalmente não ajudam muito, escondem a real programação.

marciofermino

NAO NAO ESQUECE LA NAO TEM NDA RSS

EU CONSEGUI FAZER CALCULOS ..li api e ve se é isso memso
notei que nao posso simplesmente fazer n3 = n1 + n2 .ou posso ::?

olha so como eu fiz
try {
            DecimalFormat nf = new DecimalFormat("#,##0.##");
            nf.setParseBigDecimal(true);

            BigDecimal n1 = (BigDecimal) nf.parse(jFormattedTextField1.getText());
            BigDecimal n2 = (BigDecimal) nf.parse(jFormattedTextField2.getText());

            BigDecimal resultado = n1.add(n2);

 jFormattedTextField3.setText(resultado.toString()); // aqui o resultado formatado

            String x = resultado.toString();                    // aqui o resultado em uma variavel

            JOptionPane.showMessageDialog(null, x);     // aqui sem o formato

        } catch (ParseException ex) {

        }

Se eu pudesse fazer n3 = n1 + n2 seria mais facil... fiz certo ?:

RenataFA

Então, com o tipo BigDecimal vc não pode somar simplesmente usando o +. A forma como vc fez está certa aparentemente.

Eu fiz um exemplo aqui pra vc ver de uma outra forma:

package lista;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.NumberFormat;
import java.util.Locale;
import javax.swing.JOptionPane;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.NumberFormatter;

/**
 *
 * @author  Renata
 */
public class Main extends javax.swing.JFrame {
    
    Formatador meuFormatador = new Formatador();
    
    /** Creates new form Main */
    public Main() {
        initComponents();
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        text1 = new javax.swing.JFormattedTextField();
        text2 = new javax.swing.JFormattedTextField();
        botao = new javax.swing.JButton();
        text3 = new javax.swing.JFormattedTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        text1.setFormatterFactory(meuFormatador.formataMonetario(5,2));
        text1.setValue(new BigDecimal("0.00"));

        text2.setFormatterFactory(meuFormatador.formataMonetario(5,2));
        text2.setValue(new BigDecimal("0.00"));

        botao.setText("jButton1");
        botao.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                actionPerformedBotao(evt);
            }
        });

        text3.setFormatterFactory(meuFormatador.formataMonetario(5,2));
        text3.setValue(new BigDecimal("0.00"));

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(text2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 179, Short.MAX_VALUE)
                    .add(text1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 179, Short.MAX_VALUE)
                    .add(botao)
                    .add(text3, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 179, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(text1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                .add(text2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                .add(botao)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                .add(text3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    private void actionPerformedBotao(java.awt.event.ActionEvent evt) {
        try {
            BigDecimal n1 = new BigDecimal(String.valueOf(text1.getValue()));
            BigDecimal n2 = new BigDecimal(String.valueOf(text2.getValue()));

            BigDecimal resultado = n1.add(n2); // faço a soma

            text3.setValue(resultado); // coloco o resultado na tela

            JOptionPane.showMessageDialog(null, "Resultado a partir da variável: " + resultado.setScale(2,RoundingMode.CEILING).toPlainString() + "\n" +
                                                "Resultado a partir da caixa de texto: " + text3.getText());

        } catch (Exception e) {
            // sempre imprima o erro, desvie pra um arquivo de log, enfim, faça algum tratamento. De nada adianta usar 
            // um try..catch se vc nem ficar sabendo que o erro ocorreu
            e.printStackTrace(); 
        }
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Main().setVisible(true);
            }
        });
    }
    
    // Variables declaration - do not modify
    private javax.swing.JButton botao;
    private javax.swing.JFormattedTextField text1;
    private javax.swing.JFormattedTextField text2;
    private javax.swing.JFormattedTextField text3;
    // End of variables declaration

    
    /**
     * Criei esta classe igual ao que eu tinha te passado em posts anteriores. Eu coloquei esta classe
     * dentro da classe principal, claro que no seu caso, pra que possa usar em diferentes telas, vc
     * deve criar uma classe para o Formatador.
     */
    public class Formatador{
    
        public Formatador(){}
	
	public DefaultFormatterFactory formataMonetario(int inteiros, int decimais){
            Locale meuLocale = new Locale("pt", "BR");
            
            NumberFormat nf = NumberFormat.getCurrencyInstance(meuLocale);
            NumberFormat nfEdit = NumberFormat.getNumberInstance(meuLocale);
            nf.setMinimumIntegerDigits(1);
            nf.setMaximumIntegerDigits(inteiros);
            nf.setMinimumFractionDigits(decimais);
            nf.setMaximumFractionDigits(decimais);
            nfEdit.setMinimumIntegerDigits(0);
            nfEdit.setMaximumIntegerDigits(inteiros);
            nfEdit.setMinimumFractionDigits(decimais);
            nfEdit.setMaximumFractionDigits(decimais);
		
            return new DefaultFormatterFactory(new NumberFormatter(nf), new NumberFormatter(nf), new NumberFormatter(nfEdit));
	}
    }    
}

:wink:

marciofermino

obigado…darling

E

putz RenataFA sem palavra venho aqui te agradeçer pela ajuda que voçe me deu, pois estava com o mesmo problema,
do nosso amigo.

MUITO OBRIGADO MESMO

graças a voçe terminei meu projeto!!!

olha que foi sozinho hemmmmm :smiley:

so tirei umas duvidas em topicos que ja tinha XD

obrigado mesmo

Tchello

Parabéns cara, o esforço vale a pena!

Tem algum comentário adicional a fazer a respeito da NF-Eletronica?

Abraços.

RenataFA

Parabéns!!! :wink:

Criado 7 de fevereiro de 2008
Ultima resposta 3 de fev. de 2010
Respostas 17
Participantes 6