Falha na validação de valores digitados do tipo moeda usando NumberFormat

4 respostas
egvneto

Pessoal,
Na minha aplicação tenho um JTextField onde o usuário deverá digitar um valor no formato de moeda corrente (R$ X.XXX,XX).
Para isto construí um validador que recebe uma String e tenta convertê-la para double. Se falhar, eu considero o número como inválido, se passar eu considero o número válido.
O problema é que se o usuário digita R$ 1.000,00, funciona, se ele digitar R$ 1a1a1a.00a ele também aceita! O que é bem estranho!!!

O código do validador:

class VerificadorCampoMoeda extends InputVerifier {

        public boolean verify(JComponent input) {
            JTextField tf = (JTextField) input;
            NumberFormat formatador;
            String valor = tf.getText();  // pega o valor digitado pelo usuário
            Double valorAux = Double.parseDouble("0");
            try {
                formatador = NumberFormat.getNumberInstance();
                valorAux = (formatador.parse(valor)).doubleValue();
                return true;
            } catch (ParseException e) {
                // Se deu erro como número normal, tenta como currency...
                try {
                    formatador = NumberFormat.getCurrencyInstance();
                    valorAux = (formatador.parse(valor)).doubleValue();                    
                    return true;
                } catch (ParseException e2) {
                    // Se deu erro como número normal, tenta como currency...
                    mostraErro("O número informado " + valor + " não está em um formato válido");
                    return false;
                }
            }
        }
    }

Alguém tem uma alternativa que funcione?

[]'s

4 Respostas

M

Oi egvneto,

Da uma estuda em expressão regular, não lembro como fazer, mas sei que é possível.

Dica: Utilize a tag Code para colocar os código java.

Abraços :thumbup:

egvneto

maikel.souza:
Oi egvneto,

Da uma estuda em expressão regular, não lembro como fazer, mas sei que é possível.

Dica: Utilize a tag Code para colocar os código java.

Abraços :thumbup:

Obrigado pela dica!
Editei a mensagem original com a tag.
Vou pesquisar sobre expressão regular e qualquer coisa posto aqui…
[]'s

egvneto

Olha a solução ai!!! :smiley: :smiley: :smiley:
Já havia usado expressões regulares em Perl, mas, não sabia que existia no Java.
Mais uma vez, obrigado pela dica maikel!!!

public boolean verify(JComponent input) {
            JTextField tf = (JTextField) input;
            if (Pattern.matches("(R\\$\\s)?\\d+(\\.?\\d*){0,8}((,\\d\\d)|(,\\d))?", tf.getText())) {
                return true;
            } else {
                mostraErro("O número informado " + tf.getText() + " não está em um formato válido");
                return false;
            }

Provavelmente alguém com bastante domínio em expressões regulares conseguiria fazer com uma “Pattern” mais bonita, mas, funcionou e ainda por cima o código ficou bem menor!

[]'s

M

Legal :thumbup:

Abraços

Criado 25 de junho de 2008
Ultima resposta 27 de jun. de 2008
Respostas 4
Participantes 2