Blog

Algoritmo de validação de CPF

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.

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.