Inserindo e apresentando dados no banco com vírgula

9 respostas
D

Estou tentando mascarar os fields de minha aplicação, mas isso gera uma excessão quando vou inserir os dados na tabela. Diz para corrigir o número que é apresentado com vírgula(é que usei uma máscara para utilizar vírgula).

MaskFormatter maskPreco = new MaskFormatter("##,##");
 fieldPreco = new JFormattedTextField(maskPreco );
ou
NumberFormat formatPreco = new NumberFormat.getInstance( new Locale( "pt", "BR" ) ); 
         fieldPreco = new JFormattedTextField(formatPreco);
E logo depois tem um parse para o field
float preco;
        try {
            preco = Float.parseFloat(fieldPreco.getText());
        } catch(NumberFormatException nfex) {
            JOptionPane.showMessageDialog(null, "Preencha o campo \"preço\" corretamente!\n" +nfex,
               "Erro", JOptionPane.ERROR_MESSAGE);
               return;
            }
O que devo usar para que eu possa inserir os dados na tabela?

E logo depois preciso listar os dados cadastrados em uma tabela que construi em
minha aplicação, com a ajuda de um vetor.

Mas o problema é que alguns campos que precisam apresentar vírgulas. Neste modo devo usar um MasFormatter ou NumberFormat?
try {   
       Vector cabecalho = new Vector();
       Vector linhas = new Vector();
        st = con.createStatement();   

        rs = st  .executeQuery("SELECT dado FROM tabela "+ 
                   " WHERE codGado = '" + fieldCons1.getText() + "';");  
      
            rs.next();  
            
            ResultSetMetaData rsmd = rs.getMetaData();
            
            for (int i = 1; i <= rsmd.getColumnCount(); ++i)   
               cabecalho.addElement(rsmd.getColumnName(i)); 
               
            do {   
               linhas.addElement(proximaLinha(rs, rsmd)); 
            } while (rs.next());  
            
            tabela = new JTable(linhas, cabecalho);
            tabela.setFont( f );
            
            scroller = new JScrollPane(tabela); 
            p1.add(scroller, BorderLayout.CENTER);
            
            validate();   
            st.close(); 
            
         } catch (SQLException sqlex) { ... }   
         
      }   
  
          
      private Vector proximaLinha(ResultSet rs, ResultSetMetaData rsmd) {   
          
         Vector LinhaAtual = new Vector(); 
         
         try {     
                  MaskFormatter mask = new MaskFormatter("##,##");  /* como utilizar a máscara aqui???
                                                                                        A máscara vai mostrar o dado com vírgula?  */
                  LinhaAtual.addElement(rs.getDate("dado")); 
            
        } catch (SQLException sqlex2) {    ...  } 
           catch (Exception ex2) {    ...  } 
       
         return LinhaAtual;

Obrigado.

9 Respostas

F

Olá rapaz,

No banco de dados, o separador de casas decimais é por ponto, e não virgula, e o separador de milhar, é virgula, e não ponto, ele inverte tudo, pq não está no padrão BR, entendeu ??? qdo vc for passar para o bano, vc terá que mudar novamente a mascara, tente utilizar esse metodo que eu fiz para esse proposito …

public static double decimal(String value) throws java.text.ParseException{
		Locale.setDefault(new Locale("pt","BR"));
		DecimalFormat df = new DecimalFormat("#,##0.00");
		try{
		     df.setParseBigDecimal(true);
		     BigDecimal bd =(BigDecimal)df.parse(value);
		     String val = String.valueOf(bd);
		     double dec = Double.parseDouble(val);
		     return dec;
		}catch(ParseException pe){
		    pe.printStackTrace();
		}
		     return 0;
    }

espero ter ajudado

Generosamente,

Frid

D

Por favor, poderia citar um exemplo mais claro? É que não compreendi este seu.

Então após preencher o field, o valor se converte automaticamente com vírgula mas fica a excessão do mesmo jeito.

Vou postá-la aqui:

java.lang.NumberFormatException: For input string: "11,00" at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224) at java.lang.Float.parseFloat(Float.java:422) at producao.cadastro(producao.java:247) at producao$2.actionPerformed(producao.java:201)

Obrigado.

F

Olá dark,

Vou tentar explicar,

vamos supor que seutxtcommascara.getText() seja 15,20; //certo, aqui ele está como string

esse valor do txt(seutxtcommascara) na tela, está como String, né??? se não tiver, converta ele em string, e na hora que vc for passar para o banco de dados o valor double, vc terá que chamar o método decimal com o parametro da String seutxtcommascara, esse erro de excessão está dando por causa que o preço está como float, e o valor está vindo como String, coloque o preço como double ao invés de float, tente isso…

sendo o preço com o double

try{

double preço = decimal(seutxtcommascara.getText());

}

catch(Exception e){Mensagem de erro}

agora o seu preço vai ficar com o valor 15.20, e poderá ser passado para o banco sem problemas, vc pode continuar fazendo com float, é só mudar no método o double por float, espero não ter te confundido mais, se sim, vai postando as dúvidas numeradas, fica melhor para explicar, blz

Generosamante,

Frid

D

Eu não entendi esse seu try catch.

Como que você usou o parse?

Então, se possível me ajude com o trecho:

String idade; float idade2; try { idade = fieldIdade.getText(); // vc disse que o field está em String??? pra mim a variável que está... // o que devo adicionar aqui?? } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(null, "Preencha a idade corretamente!", "Erro", JOptionPane.ERROR_MESSAGE); return; }

Obrigado.

F

Olá,

Esse método que eu postei é para o formato de casas decimais, e depois te mandei como vc chama o método, o try e catch coloquei para não lançar excessão na chamada do método, e pelo que eu olhei esse código que vc postou, vc está querendo inserir a idade, então não seria preciso o método, coloque o que vc quer inserir no BD, assim ficará mais fácil de explicar…

Generosamente,

Frid

D
Aqui está todo o método Não leve o tamanho em consideração, depois que eu resolver este problema eu dividirei tudo em sub classes.:
public void cadastro() {
       
           String num;
                num = fieldNum.getText();
            
                    
           String nome; 
                nome = fieldNome.getText();
             
           String idade;
           float idade2;
           try {
           idade = fieldIdade.getText();
           
           } catch (NumberFormatException ex) {
                JOptionPane.showMessageDialog(null, "Preencha a idade corretamente!",
                  "Erro", JOptionPane.ERROR_MESSAGE);                
                return;
           }
           
           
            
            
   // Variáveis para combos de data de inseminação  *******  
           int datInseminDia;
            
           try {
                datInseminDia = Integer.parseInt(inseminDia.getSelectedItem().toString()); 
            } catch(NumberFormatException nfex) {
                JOptionPane.showMessageDialog(null, "Preencha o dia de inseminação corretamente!", "Erro",
                  JOptionPane.ERROR_MESSAGE);
                return;
            }
            
            int datInseminMes;
             try {   
                   datInseminMes = Integer.parseInt(inseminMes.getSelectedItem().toString()); 
                 } catch(NumberFormatException nfex) {
                JOptionPane.showMessageDialog(null, "Preencha o mês de inseminação corretamente!", "Erro",
                  JOptionPane.ERROR_MESSAGE);
                return;
            }
            
            int datInseminAno;
            try {
                 datInseminAno = Integer.parseInt(inseminAno.getSelectedItem().toString());
                } catch(NumberFormatException nfex) {
                JOptionPane.showMessageDialog(null, "Preencha o ano de inseminação corretamente!", "Erro",
                  JOptionPane.ERROR_MESSAGE);
                return;
            }
            
            
            
            Date dataInseminacao = new Date();
            
             SimpleDateFormat formatInsemin = new SimpleDateFormat("dd/MM/yyyy", new Locale("pt", "BR"));  
             String datInsemin;
                 datInsemin = datInseminDia + "/" + datInseminMes + "/" + datInseminAno; 
                 
               try {  
                 datInsemin = formatInsemin.format(dataInseminacao);
                System.out.println(datInsemin);
                  } catch(NumberFormatException pex) {
                   JOptionPane.showMessageDialog(null, "Erro ao cadastrar data de inseminação" +pex, "Erro",
                      JOptionPane.ERROR_MESSAGE);
                        pex.printStackTrace();
                        return;
                    }
                
                 
           /*      try {
                     dataInseminacao = formatInsemin.parse(datInsemin);
                    } catch(ParseException pex) {
                   JOptionPane.showMessageDialog(null, "Erro ao cadastrar data de inseminação" +pex, "Erro",
                      JOptionPane.ERROR_MESSAGE);
                        pex.printStackTrace();
                        return;
                    }
             */
         
   /*** Variáveis para combos de data de secagem  *******/  
             int datSecagemDia;
             try {
                   datSecagemDia = Integer.parseInt(secagemDia.getSelectedItem().toString());
             } catch (NumberFormatException ex) {
                  JOptionPane.showMessageDialog(null, "Preencha o dia de secagem corretamente!",
                    "Erro", JOptionPane.ERROR_MESSAGE);                
                  return;
             } 
               
                int datSecagemMes;
                try {
                      datSecagemMes = Integer.parseInt(secagemMes.getSelectedItem().toString());
                } catch (NumberFormatException ex) {
                  JOptionPane.showMessageDialog(null, "Preencha o mês de secagem corretamente!",
                    "Erro", JOptionPane.ERROR_MESSAGE);                
                  return;
             }
             
             
              int datSecagemAno;
              try {
                    datSecagemAno = Integer.parseInt(secagemAno.getSelectedItem().toString());
                } catch (NumberFormatException ex) {
                  JOptionPane.showMessageDialog(null, "Preencha a data de secagem corretamente!",
                    "Erro", JOptionPane.ERROR_MESSAGE);                
                  return;
               }
               
             SimpleDateFormat formatSecagem = new SimpleDateFormat("dd/MM/yyyy");  
             String datSecag = datSecagemDia + "/" + datSecagemMes + "/" + datSecagemAno;  
             
             System.out.println(datSecag);
             
             
             Date dataSecagem;
             try {
                 dataSecagem = formatSecagem.parse(datSecag);
                } catch(ParseException pex) {
                    JOptionPane.showMessageDialog(null, "Erro ao cadastrar data de secagem" +pex, "Erro",
                      JOptionPane.ERROR_MESSAGE);
                    pex.printStackTrace();
                    return;
                }
               
          
            
 /***********   conexão   ***************/   
      
          new conexao();
          
             Connection con2;
             Statement stmt2;
      
         try {
           
           con2 = DriverManager.getConnection("jdbc:mysql://localhost/gado", "root", "2017");
           stmt2 = con2.createStatement();
              
              //String sql = "INSERT  INTO tabela1 (codGado, Raca, idade, sexo, datInsemin, datSecagem, criasMasc, criasFemin) VALUES ('" +
                           String sql = "INSERT  INTO tabela1 (codGado, Raca, idade, datInsemin ) VALUES ('" + 
              num+ "', '" +nome+ "', " +idade+ ", " +dataInseminacao+ ";";
                 
               stmt2.executeUpdate(sql);
              
               JOptionPane.showMessageDialog(null, "Dados cadastrados com sucesso!");
              
               fieldNum.setText("");
               fieldNome.setText("");
               fieldIdade.setText("");
               inseminDia.setSelectedItem(null);
               inseminMes.setSelectedItem(null);
               inseminAno.setSelectedItem(null);
               secagemDia.setSelectedItem(null);
               secagemMes.setSelectedItem(null);
               secagemAno.setSelectedItem(null);
              
               stmt2.close();
               con2.close();
F

Olá Dark,

Cara, vc postou o código aqui mas não colocou o que vc quer realmente, vou colocar um trexo corrigido do começo desse método que vc me enviou …

public void cadastro() {  
           String num;  
           num = fieldNum.getText();  
           String nome;   
           nome = fieldNome.getText();  
           int idade;  
           idade = Integer.parseInt(fieldIdade.getText();  
             }

Para a idade, não precisa colocar o try e catch, basta isso acima, vai numerando todas as suas dúvidas e posta aqui, blz …

D

Mas o bloco try e catch é para no caso de o usuário inserir om caractere não aceito. (NumberFormatException), foi isso que eu usei no catch.

E a idade é do tipo float mas como eu não consigo fazer a inserção ao banco com
o campo idade mascarado por uma vírgula, então eu deixei como int.

Se eu mascarar o campo idade e depois eu criar uma variável do tipo String para receber o
que foi digitado e adicionar no banco uma coluna idade do tipo String, vai aparecer a vírgula
na coluna quando eu usar um select na query?

Exemplo:

MaskFormatter mask = new MaskFormatter("##,##"); .... String idade = fieldIdade.getText(); .... String query = "INSERT INTO tabela (idade) VALUES('" +fieldIdade+ "'"; st.executeUpdate(query);

Se em outro código eu usar um select para mostrar o campo idade,
aí vai aparecer a vírgula, pois a idade é do tipo String. Mas como faço para que grave o campo
como uma variável [b]float]/b] e mmostre em um select com a vírgula?

É isso que eu tento fazer.

Obrigado.

F

Olá Dark,

Cara, vc está querendo persistir a idade com virgula, como assim? E como eu disse, para o banco, vai ter que ser com ponto, e não com virgula, a virgula serve para separar milhar, e não casas decimais, e no banco, creio eu que vai estar como double, e não como float …

Generosamante,

Frid

Criado 10 de setembro de 2008
Ultima resposta 15 de set. de 2008
Respostas 9
Participantes 2