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 zeroSenã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("-",""
this.cpf = this.cpf.replace(".",""
}
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.