Validar CPf Urgente

27 respostas
T

Tenho minha classe que valida o CPF, como fazer para validar o CPF em tempo de execução, vi aqui uns posts que validavam os campos como, tamanho que caracteres, passar para maiusculo com o PlaiDocumente, onde estanciava a classe para validar, agora, como fazer para executar o códico em tempo de execução, quando o usuário digitar, deve validar o cpf no meu cadastro de clientes, pois não quero validar o CPF ao gravar os dados.

package br.com.supercred.util;
/**
 * @author: Thiago Fonseca
 * e-mail: [email removido]

 */
public class ValidarCPF extends Val{

    public ValidarCPF(String nD) {
        super(nD);
        removeCaracteres();
        carregaArrayList();
    }
    private void carregaArrayList() {
        int i = 0;
        int dv1 = 0;
        int dv2 = 0;
            while (i < nD.length()) {
                    switch (i) {
                        case 0 :dv1 = 10; dv2 = 11;break;
                        case 1 :dv1 = 9 ; dv2 = 10;break;
                        case 2 :dv1 = 8 ; dv2 = 9 ;break;
                        case 3 :dv1 = 7 ; dv2 = 8 ;break;
                        case 4 :dv1 = 6 ; dv2 = 7 ;break;
                        case 5 :dv1 = 5 ; dv2 = 6 ;break;
                        case 6 :dv1 = 4 ; dv2 = 5 ;break;
                        case 7 :dv1 = 3 ; dv2 = 4 ;break;
                        case 8 :dv1 = 2 ; dv2 = 3 ;break;
                        case 9 :dv1 = 2 ; dv2 = 2 ;break;
                        case 10:dv1 = 2 ; dv2 = 1 ;break;
                    }                
                list.add(new Digito(Integer.parseInt(nD.substring(i, i+1)), dv1, dv2));
                i++;
    }
    }
    private boolean verificaDV1(){
        int i = 0;
        int soma = 0;
        int v = 0;
        while (i < 9){
            soma = soma +(list.get(i).getD() * list.get(i).getP1());
            i++;

        }
        v = 11 - (soma % 11);
        if (v == 10|| v == 11)
            v = 0;
        if (list.get(9).getD() == v){
            return true;
        }
        else{
            return false;
        }
    }
    private boolean verificaDV2(){
        int i = 0;
        int soma = 0;
        int v = 0;
        while (i < 10){
            soma = soma +(list.get(i).getD() * list.get(i).getP2());
            i++;
        }
        v = 11 - (soma % 11);
        if (v == 10)
            v = 0;
        if (list.get(10).getD() == v){
            return true;
        }
        else{
            return false;
        }
    }
    public boolean verificar() {
        if ((verificacaoMetrica(11) == true) && (verificaDV1() == true) && (verificaDV2() == true)){
            return true;
        }
        else{
            return false;
        }
    }


    public String retornar() {
        if (verificar() == true){
            StringBuffer inscr = new StringBuffer(nD);
            inscr.insert(3, ".");
            inscr.insert(7, ".");
            inscr.insert(11, "-");
            nD = ""+inscr;
            return nD;
        }
        else{
            return null;
        }
    }

}

27 Respostas

P

porque não usuou um javascript então?

T

A aplicação é desktop, não dá pra usar js.

T

Faz a validação quando o campo perder o foco…
Implementa um focusListener para o campo.

T

não sei como fazer, tem como ajudar dando um exemplo;

T

Na verdade é o inputVerifier.
Tem um exemplo bem simples na documentação.

http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/InputVerifier.html

T

Alguem sabe validar o CPF em tempo de execução de um jeito simples ?

A

Oi,

Não sei se é isso que vc precisa:http://lunadie.wordpress.com/category/java/

T

Desculpe, mas se você achou o InputVerifier difícil. Sugiro começar a estudar java.

T

Pelo visto vc sabe muito!

T

Não que seja difícil, mas estou trabalhando com hibernate, e recomendo estudar mesmo!!! Acho que não tinha dito isso na minha pergunta, como ja fiz as anotações, não sei se quando persistir os dados, haverá algum problema.

T

Olha aqui, nunca disse que sei muito, em nenhum momento ofendi você ou incitei nada. Só que se você acha um exemplo desse de 15 linhas, difícil, sim, você tem que aprender o mínimo.

T

Então tome cuidado com suas palavras antes de falar qualquer coisa. Principalmente do que não sabe.
Não atrapalhará o hibernate, se quiser, tente utilizar o validations do hibernate.

T

beleza!

T

Valeu cara, desculpa aí, se interpretei mal, valeu pela força;vamos a luta!

E

Vou mostrar a forma que eu fiz e você pode tentar adaptar para seu validador.

Eu criei uma classe (CPFValidator) com um método estático com retorno boleano para validar o CPF (isValid). Então eu chamo este método quando o textField perde o foco. Se o CPF estivesse errado eu exibia uma label informando o erro.

textField.addFocusListener(new FocusAdapter() { @Override public void focusLost(FocusEvent e) { //Se não estiver válido exibe o erro. if (!CPFValidator.isValid(textField.getText())) { labelErro.setVisible(true); } else { labelErro.setVisible(false); } } });
Fica aí como sugestão. Qualquer coisa eu posso postar o método para validação também.

Abraços.

T

Se possível, poste a sua classe de validação, não sei se a minha está correta, outra questão, como tratar o erro, por exemplo, se estiver incorreto, como faço para exibir a mgm que eu quizer, como vc tratou isso no seu código?

E

Desculpe a demora. Eu estava tentando entender o que eu tinha feito para botar os comentários. Isso que dá não comentar as coisas na hora. :XD:

public class CPFValidator {

    public static boolean isValid(String cpf) {
        //Se o CPF não tiver 11 dígitos é inválido.
        if (cpf.length() != 11)
            return false;

        //Guardará os dígitos gerados.
        int[] digitos = new int[2];

        //Gera os dois últimos dígitos.
        for (int multiplicador=10; multiplicador <= 11; multiplicador++) {
            int soma = 0;
            //Faz as multiplicações e já soma os resultados.
            for (int i=0; i < (multiplicador-1); i++) {
                soma += Integer.parseInt(cpf.substring(i, i+1)) * (multiplicador - i);
            }
            //verifica o resto.
            int resto = (soma % 11);
            //Carrega a posição do array.
            if (resto < 2) {
                digitos[multiplicador-10] = 0;
            } else {
               digitos[multiplicador-10] = 11 - resto;
            }
        }
        //Retorna true se os dois últimos dígitos da string forem iguais os gerados.
        return (digitos[0] == Integer.parseInt(cpf.substring(9, 10)) &&
                digitos[1] == Integer.parseInt(cpf.substring(10, 11)));
    }

}
Eu fiz a validação baseado neste algoritmo: [url]http://imasters.uol.com.br/artigo/2410/javascript/algoritmo_do_cpf/[/url]. Só teria que colocar uma condição para verificar se todos os dígitos são iguais. Não coloquei neste código por motivo de testes.

Quanto ao tratamento do erro. Acho interessante deixar o usuário livre para preencher os campos na ordem que quiser. Se houver algum erro de validação, apenas exibo uma label com o erro no próprio formulário e desabilito o botão para salvar até que não haja mais erros. Ou então deixo o botão habilitado e exibo uma caixa de mensagem informando que há erros, se for o caso.

A única coisa que não gosto de fazer é prender o usuário a um campo ou ficar exibindo dezenas de caixas de mensagens cada vez que ele erra alguma coisa. Para o usuário isso é muito chato.

Mas este é um assunto com diversas possibilidades. Tem que ver a que se encaixa melhor com sua aplicação.

[EDIT]Além da validação de CPF, seria interessante limitar a quantidade de caracteres e permitir que sejam digitados apenas números pelo Document. Maiores informações no Artigo: Controlando um JTextField.

T

este método nao funcionou!

E

O erro foi na validação? Especifique mais o problema.

Fiz uma classe para testar e funcionou normal para validar alguns CPFs e invalidar minhas tentativas de acertar o CPF na raça :lol: . Mas nada impede que eu esteja errado.
import java.util.Scanner;

public class teste {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		if (CPFValidator.isValid(input.nextLine())) {
			System.out.println("Válido");
		} else {
			System.out.println("Inválido");
		}
	}
	
}
T

Fiz o método busvando do meu Jformated, e simplesmente nao retornou nada nem se está errado ou correto,

E

Se possível, posta a parte do código que está sendo validado o CPF.

T

parte que formata e chama o código para validar o cpf

txtCpf.setDocument(new QuantidadeDigitos(14));//Funciona -> aceita o numero que eu quizer de caracteres
        txtCpf.addFocusListener(new FocusAdapter() {}); --abstrato

       
        txtCpf.setFocusLostBehavior(javax.swing.JFormattedTextField.PERSIST);
        try {
            txtCpf.setFormatterFactory(new DefaultFormatterFactory(new MaskFormatter("###.###.###-##")));
        } catch (ParseException ex) {
            System.err.println(ex.getMessage());
        }

--focus

public void focusLost(FocusEvent e) {
        //Se não estiver válido exibe o erro.
        if (!CPFValidator.isValid(txtCpf.getText())) {
           txtAviso.setVisible(true);
        } else {
           txtAviso.setVisible(false);
        }

não funcionou nao dá nenhum erro e nenhum aviso

E

O método focusLost deve estar dentro da classe FocusAdapter que você adicionou em txtCpf.

txtCpf.addFocusListener(new FocusAdapter() { public void focusLost(FocusEvent e) { //Se não estiver válido exibe o erro. if (!CPFValidator.isValid(txtCpf.getText())) { txtAviso.setVisible(true); } else { txtAviso.setVisible(false); } });
Outra coisa. O método está validando uma string com os 11 dígitos do cpf sem os pontos. Se o retorno de txtCpf tiver os pontos, passe só os números para o validador.

if (!CPFValidator.isValid(txtCpf.getText().replaceAll("[^0-9]", ""))) {

Vamos ver se agora vai. :smiley:

T
ESTÁ DANDO ESTE ERRO QUANDO COLOCO
txtCpf.addFocusListener(new FocusAdapter() {
[quote]
java.lang.ClassFormatError: Method "<error>" in class br/com/supercred/view/FormPMMG has illegal signature "LtxtCpf/addFocusListener;"[/quote]
E

Este código passado para definir a máscara e adicionar o FocusListener esta dentro de um método ou do construtor? Ou está no corpo da classe?

T

está no topo

E

Crie um método para inicializar o textField e chame-o no construtor. Ou coloque o código direto no construtor.

A exceção postada diz que a assinatura é ilegal (illegal signature). É provável que a linha “txtCpf.addFocusListener(new FocusAdapter()” esteja no corpo da classe e o compilador esteja reconhecendo como declaração de método com assinatura ilegal, ou algo do gênero.

Criado 10 de setembro de 2010
Ultima resposta 12 de set. de 2010
Respostas 27
Participantes 5