Validar casas decimais [RESOLVIDO]

Bom dia, pessoal!!!

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:

[code]
private boolean verificarPrecoPreenchido() {
//funçao verificará se o campo preco foi preenchido
DecimalFormat decimal = new DecimalFormat(“0.00”); // verica se valor é decimal

     boolean retorno = false;

    String precoProduto =  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. 
     
    Double dPrecoProduto = Double.parseDouble(precoProduto);
    String sPrecoProduto = decimal.format(dPrecoProduto);
    boolean virgula = precoProduto.contains(",");
     
     
    if ((precoProduto.isEmpty() == true)||((!sPrecoProduto.equals(precoProduto)) == true)||(virgula == false)) {
        retorno = false;

    } else {
        retorno = true;
    }
    return retorno;

 }  [/code]

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.

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:

/**
 * 
 */
package guj;

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.ParseException;
import java.util.Locale;

import javax.swing.JOptionPane;

/**
 */
public class ExemploDecimalFormat {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Locale ptBR = new Locale ("pt", "BR");
        DecimalFormat df = new DecimalFormat ("#,##0.00", new DecimalFormatSymbols (ptBR));
        double margem = 0;
        double valor = 0;
        String strMargem, strValor;
        boolean ok = false;
        do {
            strMargem = JOptionPane.showInputDialog(null, "Entre com a margem em porcentagem (exemplo: 5,00 )");
            try {
                margem = df.parse(strMargem).doubleValue();
                ok = true;
            } catch (ParseException ex) {
                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 (ParseException ex) {
                JOptionPane.showMessageDialog (null, "ERRO - Entre com um valor válido. Exemplo: 1.000,00");
            }
        } while (!ok);
        double valorCalculado = margem / 100.0 * valor;
        String resposta = String.format (ptBR, "Usando a margem de %.2f %% sobre o valor de %.2f, o resultado é %.2f", 
            margem, valor, valorCalculado);
        JOptionPane.showMessageDialog (null, resposta);
    }
}

[quote=digaoneves]O que você quer dizer com validar as duas casas decimais e a virgula?

Indique a linha onde ocorre o erro também.[/quote]

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.

O erro ocorre a partir desta linha:

Double dPrecoProduto = Double.parseDouble(precoProduto); 

Grata!!!

Acho que o entanglement matou essa aí com a resposta dele :slight_smile:

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.

Eu modifiquei meu código como o entanglement sugeriu, porém o erro agora apresenta na função retorno:

[code] private boolean verificarPrecoPreenchido() { // ERRO APRESENTADO: missing return statement
//funçao verificará se o campo login foi preenchido

    try {  
        boolean retorno = false;
        double valor = 0; 
        String precoProduto =  jFormattedTextFieldValorProduto.getText();
        
     
            valor = df.parse(precoProduto).doubleValue();
            
            if (precoProduto.isEmpty() == true) {
        retorno = false;

    } else {
        retorno = true;
    }
  
 return retorno; 
             
        } catch (ParseException ex) {   
            JOptionPane.showMessageDialog (null, "ERRO - Entre com um valor válido. Exemplo: 1.000,00");   
 
 }
    
 }[/code]

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”

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.

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:

 private void verificaCamposPreco() throws ParseException {

    private static double preco = 0;
    Locale ptBR = new Locale("pt", "BR");
    DecimalFormat df = new DecimalFormat("#,##0.00", new DecimalFormatSymbols(ptBR));

        boolean flagPrecoOK = false;
        double dPrecoProduto = 0;
        double valor = 0;

        boolean flagApresentarJanelaErro = false;

        // ---------------------- VALIDACAO PRECO -------------------------------
        flagPrecoOK = verificarPrecoPreenchido();
        if (flagPrecoOK == false) {
            jLabelValorVenda.setForeground(new java.awt.Color(255, 0, 0));//vermelho
            flagApresentarJanelaErro = true;
        } else {

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

    private boolean verificarPrecoPreenchido() {


        boolean retorno = false;
        String precoProduto = jFormattedTextFieldValorProduto.getText();
        Pattern pattern = Pattern.compile(",\\d{2}$");
        Matcher matcher = pattern.matcher(precoProduto);
        if (matcher.find()) {
            if (precoProduto.isEmpty() == true) {
                retorno = false;

            } else {
                retorno = true;
            }

        }
        return retorno;
    }


MUITO OBRIGADA!!!