Blog
Algoritmo de validação de CPF
TAGs: Desenvolvimento Grails
Oi galera bom dia,
Hoje vou mostrar um script em grails que fiz para a validação de CPF, mais primeiro vamos a lógica que utilizei para fazer o script:
CPF (Cadastro de Pessoa Física), é um padrão brasileiro.
O CPF tem 11 dígitos, os dois últimos são chamados de dígitos verificadores e são conseqüência dos nove anteriores. Isso quer dizer que você pode idealizar qualquer combinação de nove dígitos e só precisa calcular os dois últimos dígitos para ter um CPF válido.
O primeiro dígito é o um número que depende do resto da soma de uma multiplicação de cada um dos nove dígitos por 10, 9, … 3, 2 por 11. E a do segundo é o mesmo esquema, porém inclui o primeiro dígito verificador, e a multiplicação começa em 11 ( 11, 10 … 3, 2 ).
Matematicamente falando, o primeiro dígito é 0 se o resto da divisão de (10*a+9*b+8*c+7*d+6*e+5*f+4*g+3*h+2*i ) por 11 for menor que 2 e é a diferença entre 11 e o resto da divisão caso contrário, sendo abcdefghi os nove primeiros números do CPF.
Para exemplificar vou usar 123456789 como os primeiros nove dígitos do CPF.
Dígitos do CPF |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
Multiplicadores |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
Produtos |
10 |
18 |
24 |
28 |
30 |
30 |
28 |
24 |
18 |
* Para calcular o primeiro dígito verificador soma-se os produtos e divide por 11. Caso o resto da divisão seja menor que 2 o dígito verificador é 0, senão é a diferença de 11 e o próprio resto.
Com esta tabelinha fica bem mais fácil o cálculo do primeiro dígito verificar, usando módulo 11:
10 + 18 + 24 + 28 + 30 + 30 + 28 + 24 + 18 = 210
210 % 11 = 1
Como um é menor que dois, o dígito é zero.
Vamos ao próximo dígito verificador:
Dígitos do CPF |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
0 |
Multiplicadores |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
Produtos |
11 |
20 |
27 |
32 |
35 |
36 |
35 |
32 |
27 |
0 |
Somando os produtos temos:
11 + 20 + 27 + 32 + 35 + 36 + 35 + 32 + 27 + 0 = 255
255 % 11 = 2
Como 2 não é menor que 2, o segundo dígito verificador é 11 – 2 = 9.
Assim, o CPF completo é 123456789-09.
Vamos agora ao método que usei pra aplicar esta teoria no meu script grails:
for(pessoa in pessoas){
cpf = pessoa?.cpf;
if( cpf?.size()>=9 && cpf!=null){
vetor = cpf.split("");
somatorio = ( Integer.parseInt( vetor[1] ) * 10 ) + ( Integer.parseInt( vetor[2] ) * 9) + ( Integer.parseInt( vetor[3] ) * 8) +
( Integer.parseInt( vetor[4] ) * 7) + ( Integer.parseInt( vetor[5] ) * 6) + ( Integer.parseInt( vetor[6] ) * 5) +
( Integer.parseInt( vetor[7] ) * 4) + ( Integer.parseInt( vetor[8] ) * 3) + (Integer.parseInt( vetor[9] ) * 2);
resto = somatorio%11;
if(resto>2){
digito1 = 11 - resto;
if(digito1<0) digito1 * -1;
}else{
digito1 = 0;
}
somatorio = ( Integer.parseInt( vetor[1] ) * 11 ) + ( Integer.parseInt( vetor[2] ) * 10) + ( Integer.parseInt( vetor[3] ) * 9) +
( Integer.parseInt( vetor[4] ) * 8) + ( Integer.parseInt( vetor[5] ) * 7) + ( Integer.parseInt( vetor[6] ) * 6) +
( Integer.parseInt( vetor[7] ) * 5) + ( Integer.parseInt( vetor[8] ) * 4) + (Integer.parseInt( vetor[9] ) * 3) + (digito1 * 2);
resto = somatorio%11;
if(resto>2){
digito2 = 11 - resto;
if(digito2<0) digito2 * -1;
}else{
digito2 = 0;
}
pessoa.cpf = cpf[0..8] + String.valueOf(digito1) + String.valueOf(digito2);
pessoa.save(flush:true);
}
}
Bom dia galera ate o próximo post,
Márcio José da Silva.