Inserindo e apresentando dados no banco com vírgula

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?

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

Obrigado.

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

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.

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

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.

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

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.:

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

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 …

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.

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