Formatação Moeda

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();
        }

        
        
     

.

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

[quote=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??[/quote]

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/

[quote=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. [/quote]
Ao invés de colar o código use a classe Dinheiro.

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:

[code]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”));[/code]

Um trecho da classe Formatador:

[code]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));
}

}[/code]

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:

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

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));

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)

É, 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());

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());

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


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.

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

[code]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) {

    }[/code]

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

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:

[code]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.
      */
      //
      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();
      }//

    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));
    

    }
    }
    }[/code]

:wink:

obigado…darling

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

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

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

Abraços.

Parabéns!!! :wink: