sábado, 16 de outubro de 2010

Validação de CPF

Embora para programadores mais experientes esse assunto seja redundante, para outros iniciantes pode ser útil, portanto segue o algoritmo de validação do CPF.

O CPF contém 11 números, sendo 9 deles definidos pela Receita Federal e os dois últimos verificadores.
Primeiro vou tentar mostrar como funciona o cálculo e depois posto uma função em PHP.

Pra facilitar usarei n1 como o primeiro dígito, n2 como o segundo e assim sucessivamente...

Para encontrar qual é o primeiro dígito verificador é feito o seguinte cálculo:

(n1*10)+(n2*9)+(n3*8)+(n4*7)+(n5*6)+(n6*5)+(n7*4)+(n8*3)+(n9*2)

Após somar todas as parcelas, dividi-se esse valor por 11.
Caso o resto desta divisão for 1 ou 0 então o primeiro dígito verificador é igual a zero.
Caso o resto desta divisão for maior ou igual a 2 então subtrai-se 11 do resto desta divisão e obtém-se então o primeiro dígito verificador.

Para encontrar qual é o segundo dígito verificador é feito o seguinte cálculo:
Observe que agora o primeiro dígito verificador também entra na conta.

(n1*11)+(n2*10)+(n3*9)+(n4*8)+(n5*7)+(n6*6)+(n7*5)+(n8*4)+(n9*3)+(n10*2)

Após somar todas as parcelas, dividi-se esse valor por 11.
Caso o resto desta divisão for 1 ou 0 então o segundo dígito verificador é igual a zero.
Caso o resto desta divisão for maior ou igual a 2 então subtrai-se 11 do resto desta divisão e obtém-se então o segundo dígito verificador.

A seguir segue uma função em PHP que retorna TRUE para CPF válidos e FALSE para CPF inválidos:
(Para aqueles que programam orientado a objetos basta colocá-la como método de sua classe)

function ValidaCPF ($partes){


$soma = ($partes[0]*10)+($partes[1]*9)+($partes[2]*8)+($partes[3]*7)+($partes[4]*6)+($partes[5]*5)+($partes[6]*4)+($partes[7]*3)+($partes[8]*2);


if ($soma%11<2)
   $D1 = 0;
   else
   $D1 = 11 -($soma%11);


$soma = ($partes[0]*11)+($partes[1]*10)+($partes[2]*9)+($partes[3]*8)+($partes[4]*7)+($partes[5]*6)+($partes[6]*5)+($partes[7]*4)+($partes[8]*3)+($partes[9]*2);


if ($soma%11<2)
   $D2 = 0;
   else
   $D2 = 11 -($soma%11);


//Após encontrar os dois dígitos verificadores ele testa se são iguais aos enviados pelo usuário
if ($D1==$partes[9] && $D2==$partes[10])
   return TRUE;
   else
   return FALSE;
}


Espero ter ajudado.....

Nenhum comentário:

Postar um comentário