Então, eu construi um pequeno projeto no qual o usuário tem disponível um Jframe (interface) no qual possui um jTextField para este entrar com um valor em dinheiro (reais), por exemplo: 5,00 ou 4567,54.
Eu devo validar as duas casas decimais e a virgula, como eu faço isto?
Eu havia pensado na seguinte função de verificação:
privatebooleanverificarPrecoPreenchido(){//funçao verificará se o campo preco foi preenchidoDecimalFormatdecimal=newDecimalFormat("0.00");// verica se valor é decimalbooleanretorno=false;StringprecoProduto=jFormattedTextFieldValorProduto.getText();//isEmpty(): Função que verifica se uma variável está vazia (incluindo espaços em branco).//retorna: VERDADEIRO se está vazio; FALSO caso contrário. DoubledPrecoProduto=Double.parseDouble(precoProduto);StringsPrecoProduto=decimal.format(dPrecoProduto);booleanvirgula=precoProduto.contains(",");if((precoProduto.isEmpty()==true)||((!sPrecoProduto.equals(precoProduto))==true)||(virgula==false)){retorno=false;}else{retorno=true;}returnretorno;}
Porém o seguinte erro está sendo apresentado: Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException
O que você quer dizer com validar as duas casas decimais e a virgula?
Indique a linha onde ocorre o erro também.
E
entanglement
DecimalFormat tem um método chamado parse. É ele que você deve usar para validar as tais “casas decimais”.
Dê uma olhada neste código, que postei faz poucos dias:
/** * */packageguj;importjava.text.DecimalFormat;importjava.text.DecimalFormatSymbols;importjava.text.ParseException;importjava.util.Locale;importjavax.swing.JOptionPane;/** */publicclassExemploDecimalFormat{/** * @param args */publicstaticvoidmain(String[]args){LocaleptBR=newLocale("pt","BR");DecimalFormatdf=newDecimalFormat("#,##0.00",newDecimalFormatSymbols(ptBR));doublemargem=0;doublevalor=0;StringstrMargem,strValor;booleanok=false;do{strMargem=JOptionPane.showInputDialog(null,"Entre com a margem em porcentagem (exemplo: 5,00 )");try{margem=df.parse(strMargem).doubleValue();ok=true;}catch(ParseExceptionex){ex.printStackTrace();JOptionPane.showMessageDialog(null,"ERRO - Entre com um valor válido para a margem. Exemplo: 5,00");}}while(!ok);ok=false;do{strValor=JOptionPane.showInputDialog(null,"Entre com o valor em reais (exemplo: 1.000,00 )");try{valor=df.parse(strValor).doubleValue();ok=true;}catch(ParseExceptionex){JOptionPane.showMessageDialog(null,"ERRO - Entre com um valor válido. Exemplo: 1.000,00");}}while(!ok);doublevalorCalculado=margem/100.0*valor;Stringresposta=String.format(ptBR,"Usando a margem de %.2f %% sobre o valor de %.2f, o resultado é %.2f",margem,valor,valorCalculado);JOptionPane.showMessageDialog(null,resposta);}}
vanessa.tenorio
digaoneves:
O que você quer dizer com validar as duas casas decimais e a virgula?
Indique a linha onde ocorre o erro também.
Então, quando eu digo validar é porque eu quero verificar se o número que o usuário entrou possui duas casas decimais e vírgula, como por exemplo: 3,25.
Acho que o entanglement matou essa aí com a resposta dele
Mas, entanglement, Uma validação com expressões regulares assim:String precoProduto = jFormattedTextFieldValorProduto.getText().trim();
Pattern pattern = Pattern.compile(",\\d{2}$");
Matcher matcher = pattern.matcher(precoProduto);
if(matcher.find()){
// continuação
} Não resolveria?
EDIT: Editei o código para usar Pattern e Matcher.
vanessa.tenorio
Eu modifiquei meu código como o entanglement sugeriu, porém o erro agora apresenta na função retorno:
privatebooleanverificarPrecoPreenchido(){// ERRO APRESENTADO: missing return statement//funçao verificará se o campo login foi preenchidotry{booleanretorno=false;doublevalor=0;StringprecoProduto=jFormattedTextFieldValorProduto.getText();valor=df.parse(precoProduto).doubleValue();if(precoProduto.isEmpty()==true){retorno=false;}else{retorno=true;}returnretorno;}catch(ParseExceptionex){JOptionPane.showMessageDialog(null,"ERRO - Entre com um valor válido. Exemplo: 1.000,00");}}
vanessa.tenorio
digaoneves , eu inseri as linhas de código que você solicitou, porém agora o erro apenas apresenta quando eu entro com um valor assim: 12,07.
Erro: Exception in thread “AWT-EventQueue-0” java.lang.NumberFormatException: For input string: “12,07”
Rodrigo_Sasaki
Você declarou o seu DecimalFormat como o entanglement sugeriu? Locale ptBR = new Locale ("pt", "BR");
DecimalFormat df = new DecimalFormat ("#,##0.00", new DecimalFormatSymbols (ptBR)); Porque um double normalmente não vai aceitar um valor separado por vírgula, visto que o padrão é a separação por ponto. double d1 = 10.45; // OK
double d2 = 10,45; // Erro Porém setando o DecimalFormatSymbols com o Locale “pt-BR”, o parse funcionaria com a vírgula.
vanessa.tenorio
Pessoalllll… resolvi meu problema através do conhecimento do digaoneves e do entanglement. O grande problema era: double normalmente não vai aceitar um valor separado por vírgula.
Meu código ficou assim:
privatevoidverificaCamposPreco()throwsParseException{privatestaticdoublepreco=0;LocaleptBR=newLocale("pt","BR");DecimalFormatdf=newDecimalFormat("#,##0.00",newDecimalFormatSymbols(ptBR));booleanflagPrecoOK=false;doubledPrecoProduto=0;doublevalor=0;booleanflagApresentarJanelaErro=false;// ---------------------- VALIDACAO PRECO -------------------------------flagPrecoOK=verificarPrecoPreenchido();if(flagPrecoOK==false){jLabelValorVenda.setForeground(newjava.awt.Color(255,0,0));//vermelhoflagApresentarJanelaErro=true;}else{StringprecoProduto=jFormattedTextFieldValorProduto.getText();valor=df.parse(precoProduto).doubleValue();dadosLogin.setPRECO(valor);}if(flagApresentarJanelaErro==true){JOptionPane.showMessageDialog(null,"Dados Inválidos!","Indicador Vendas",JOptionPane.ERROR_MESSAGE);}else{// CADASTRAR PRECO NO BANCO DE DADOS JOptionPane.showMessageDialog(null,jFormattedTextFieldValorProduto.getText()," Indicador Vendas",JOptionPane.ERROR_MESSAGE);this.dispose();}}privatebooleanverificarPrecoPreenchido(){booleanretorno=false;StringprecoProduto=jFormattedTextFieldValorProduto.getText();Patternpattern=Pattern.compile(",\\d{2}$");Matchermatcher=pattern.matcher(precoProduto);if(matcher.find()){if(precoProduto.isEmpty()==true){retorno=false;}else{retorno=true;}}returnretorno;}