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