Logo Hardware.com.br
djJoe
djJoe Geek Registrado
1.4K Mensagens 183 Curtidas

Tutorial - validar cpf em java

#1 Por djJoe 05/10/2012 - 16:12
Olá amigos, resolvi desenvolver uma classe para validação de CPF em Java, tanto para usar em meus programas quanto para criar esse tutorial para os iniciantes em Java.
Uma breve explicação sobre o algoritmo de validação de CPF: O CPF é composto por 11 dígitos, os dois últimos são os dígitos verificadores, então, para obter o primeiro dígito verificador é efetuado um calculo com os 9 primeiros dígitos e, para obter o segundo dígito verificador é efetuado um calculo com os 9 primeiros dígitos mais o primeiro dígito obtido do calculo anterior. Por exemplo, digamos que queremos validar o CPF 222.222.222-22, 1° digito: Vamos pegar os 9 primeiros dígitos e multiplicar cada um em ordem crescente da direita para a esquerda a partir do número 2.


2 2 2 2 2 2 2 2 2
10 9 8 7 6 5 4 3 2
20 18 16 14 12 10 8 6 4


Em seguida somamos todos os resultados da multiplicação:
20 + 18 + 16 + 14 + 12 + 10 + 8 + 6 + 4 = 108

Agora vamos dividir o resultado da soma por 11 e usaremos apenas o resto da divisão:
108 / 11 = resto = 9, se o resto da divisão for menor que 2, o dígito será 0 (zero) , mas se o resto da divisão for igual ou maior que 2, então o dígito verificador será igual a 11 menos ( - ) o resto da divisão, como o resto da nosso exemplo foi o valor 9 o primeiro dígito será :
11 – 9 = 2. Pronto já temos nosso primeiro dígito verificador, vamos partir para o segundo dígito, que como informei acima, será usado o primeiro dígito obtido para o calculo:



2 2 2 2 2 2 2 2 2 2
11 10 9 8 7 6 5 4 3 2
22 20 18 16 14 12 10 8 6 4

Como adicionamos o primeiro dígito ao calculo o último número para multiplicação agora será 11.
Em seguida somamos todos os resultados da multiplicação:

22 + 20 + 18 + 16 + 14 + 12 + 10 + 8 + 6 + 4 = 130

Agora vamos dividir o resultado da soma por 11 e usaremos resto:
130 / 11 resto = 9, como o resto da divisão foi maior que 2 então o segundo dígito será:
11 – 9 = 2.
Pronto, agora é só comparar os dígitos verificadores do CPF com os dígitos gerados.
Iniciaremos agora o desenvolvimento da nossa classe, vamos tentar criar um código limpo e organizado tornando assim fácil o entendimento, para isso vamos deixar nossa classe pequena e bem divida entre métodos.
O nome da nossa classe será ValidarCpf, vamos criar também uma variável String CPF que armazenará o CPF informado.


public final class ValidarCpf {
private String cpf;
}
Vamos criar agora um método para remover os caracteres inválidos para o nosso calculo, são eles: “ - “, “ . ”.

private void removerCaracteres(){
this.cpf = this.cpf.replace("-",""
this.cpf = this.cpf.replace(".",""
}
O método replace() substitui o primeiro argumento pelo segundo, até aí tudo bem, agora vamos criar um método para verificar se o CPF realmente tem 11 dígitos.

private boolean verificarSeTamanhoInvalido(String cpf){
if ( cpf.length() != 11 )
return true;
return false;
}
Esse método verifica se o tamanho do CPF informado é maior ou menor que 11 caso verdadeiro retorna true, caso ela contenha 11 dígitos retorna false.
Vamos agora criar um método para verificar se a seqüência de caracteres são todas iguais, muitos códigos encontrados na net classificam seqüências iguais como falso , mas, verificando no site da receita da fazenda a única seqüência considerada como falsa é a de 0 ( zero ). Caso queiram conferir: http://www.receita.fazenda.gov.br/aplicacoes/atcta/cpf/consultapublica.asp
Vamos criar um método que verifique qualquer seqüência.

private boolean verificarSeDigIguais(String cpf){
//char primDig = cpf.charAt(0);
char primDig = '0';
char [] charCpf = cpf.toCharArray();
for( char c: charCpf )
if ( c != primDig )
return false;
return true;
}
Esse método recebe uma String representando um CPF, cria um array de char baseado na String e, usando um foreach percorre todo o array verificando se é igual ao primeiro caractere, se a seqüência for igual retorna true, caso contrario retorna false, se você quiser considerar quaisquer seqüências iguais como falsa basta só substituir a linha de código

char primDig = '0';
Por a linha comentada.

//char primDig = cpf.charAt(0);
Vamos agora criar um método para efetuar o calculo, criaremos apenas um método que sirva para gerar os dois dígitos.

private String calculoComCpf(String cpf){
int digGerado = 0;
int mult = cpf.length()+1;
char [] charCpf = cpf.toCharArray();
for ( int i = 0; i < cpf.length(); i++ )
digGerado += (charCpf[i]-48)* mult--;
if ( digGerado % 11 < 2)
digGerado = 0;
else
digGerado = 11 - digGerado % 11;
return String.valueOf(digGerado);
}
Esse método como vocês podem ver recebe e retorna uma String, criamos uma variável int digGerado que servirá para armazenar o resultado do calculo, criamos também uma variável int mult que servirá para multiplicar cada dígito do CPF, novamente criamos um array de char e percorremos todo o array somando e multiplicando cada dígito, logo em seguida verifica se o resto do resultado dividido por 11 é menor que 2, caso seja menor digGerado será igual a zero
Senão digGerado será igual 11 – o resto da divisão, em seguida converte digGerado em String e retorna o mesmo.
Criaremos agora o único método publico, pois o usuário precisará saber da existência dele e somente isso, não precisará conhecer nenhum outro método criado até agora, será ele quem validará o CPF


public boolean validarCpf(String cpf){

if ( cpf == null ){
return false;
}
else{
String cpfGerado = "";
this.cpf = cpf;

removerCaracteres();
if ( verificarSeTamanhoInvalido(this.cpf) )
return false;

if ( verificarSeDigIguais(this.cpf) )
return false;

cpfGerado = this.cpf.substring(0, 9);
cpfGerado = cpfGerado.concat(calculoComCpf(cpfGerado));
cpfGerado = cpfGerado.concat(calculoComCpf(cpfGerado));

if ( !cpfGerado.equals(this.cpf))
return false;
}
return true;
}
Não preciso nem explicar né? Caso seja valido retornará true, caso contrario retornará false.
E aqui a classe completa.


/**
*
* @author Wellington de lima alves
*/

public final class ValidarCpf {
private String cpf;
public ValidarCpf() {
}
public boolean validarCpf(String cpf){
if ( cpf == null ){
return false;
}
else{
String cpfGerado = "";
this.cpf = cpf;
removerCaracteres();
if ( verificarSeTamanhoInvalido(this.cpf) )
return false;
if ( verificarSeDigIguais(this.cpf) )
return false;
cpfGerado = this.cpf.substring(0, 9);
cpfGerado = cpfGerado.concat(calculoComCpf(cpfGerado));
cpfGerado = cpfGerado.concat(calculoComCpf(cpfGerado));

if ( !cpfGerado.equals(this.cpf))
return false;
}
return true;
}

private void removerCaracteres(){
this.cpf = this.cpf.replace("-","&quot;
this.cpf = this.cpf.replace(".","&quot;
}
private boolean verificarSeTamanhoInvalido(String cpf){
if ( cpf.length() != 11 )
return true;
return false;
}
private boolean verificarSeDigIguais(String cpf){
//char primDig = cpf.charAt(0);
char primDig = '0';
char [] charCpf = cpf.toCharArray();
for( char c: charCpf )
if ( c != primDig )
return false;
return true;
}
private String calculoComCpf(String cpf){
int digGerado = 0;
int mult = cpf.length()+1;
char [] charCpf = cpf.toCharArray();
for ( int i = 0; i < cpf.length(); i++ )
digGerado += (charCpf[i]-48)* mult--;
if ( digGerado % 11 < 2)
digGerado = 0;
else
digGerado = 11 - digGerado % 11;
return String.valueOf(digGerado);
}
}
É isso aí pessoal, até a próxima.
Responder
Henry-Keys
Henry-Keys Geek Registrado
1.8K Mensagens 235 Curtidas
#2 Por Henry-Keys
05/10/2012 - 16:35
Muito bom o tutorial. Parabéns
Até eu que nada sei de Java achei didático.

Java e linguagem C têm uma sintaxe muito parecida, portanto não foi ntão difícil entender os códigos.

É esse o Joe que pouco conheço.... kkkk

Já que vc manja de Java, será que você poderia sanar uma dúvida minha:
Em Java existe um tipo de dados AnsiString igual ao C++ (que na verdade facilitam muitas tarefas).

T+
djJoe
djJoe Geek Registrado
1.4K Mensagens 183 Curtidas
#7 Por djJoe
07/10/2012 - 20:12
D3V1LL3 disse:
Só uma pergunta qual o proposito final dessa classe? agregar conhecimento? testar novas formas de implementação?

Achei bem legal e pergunto isso porque para Java Web eu uso alguns jar com annotations ... o pessoal da Caelum disponibiliza o Stella que é bem completo... dá uma olhada depois =]


[ ]'s


Hum... já ouvi falar sobre Stella, mas nunca usei.
O proposito final é como eu citei no inicio do tópico, um tutorial para os iniciantes que chegam aqui a procura de algo em java. Estou desenvolvendo um soft para um cliente e resolvi criar a minha própria classe, aproveitei e criei esse tutorial já que nunca tinha colaborado com algo desse tipo.


Obrigado pelos comentários!
D3V1LL3
D3V1LL3 Super Participante Registrado
667 Mensagens 25 Curtidas
#8 Por D3V1LL3
07/10/2012 - 22:10
djJoe disse:
Hum... já ouvi falar sobre Stella, mas nunca usei.
O proposito final é como eu citei no inicio do tópico, um tutorial para os iniciantes que chegam aqui a procura de algo em java. Estou desenvolvendo um soft para um cliente e resolvi criar a minha própria classe, aproveitei e criei esse tutorial já que nunca tinha colaborado com algo desse tipo.


Obrigado pelos comentários!


É bem completo o Stella.... para quem tem um conhecimento básico como eu é legal montar classes assim para entender o código... só não pode querer reinventar a roda...mostrando_lingua.png


[ ]'s
"Aprendiz Emergente"
Responder Tópico
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal