Validar casas decimais [RESOLVIDO]

8 respostas
vanessa.tenorio

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:

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

Porém o seguinte erro está sendo apresentado:
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException

8 Respostas

Rodrigo_Sasaki

O que você quer dizer com validar as duas casas decimais e a virgula?

Indique a linha onde ocorre o erro também.

E

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

O erro ocorre a partir desta linha:

Double dPrecoProduto = Double.parseDouble(precoProduto);

Grata!!!

Rodrigo_Sasaki

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.

vanessa.tenorio

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

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");   
     
     }
        
     }
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:

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!!!

Criado 25 de junho de 2012
Ultima resposta 25 de jun. de 2012
Respostas 8
Participantes 3