Bom,dei uma pesquisada no fim de semana e achei esse artigo interessante sobre como funciona a checagem de cpf em sites e programas (online/offline) Espero que sirva para analise e entendimento e assim ajudar em futuras aplicações. Ps: o codigo usado como exemplo abaixo é de Java Script,mas a logica é a mesma para qualquer outro tipo de programa. Boa Leitura.
Como Funciona a Checagem de CPF em sites e programas em geral?
Vamos entender um pouco como funciona o algoritmo
do CPF. Na primeira parte estudaremos o funcionamento do cálculo
do CPF para validar os dígitos verificadores que fazem
a diferenciação de um CPF para outro.
Logo abaixo segue um código que faz a validação
do CPF, mas mesmo que você queria desenvolver o seu próprio
código, em javascript ou outra linguagem, abaixo segue
uma breve explicação.
Esse algoritmo que é responsável
pela validação do CPF foi feito de acordo com a
regras do Ministério da Fazenda.
Conhecendo o cálculo do algoritmo
do CPF
O CPF é composto por onze algarismos, onde
os dois últimos são chamados de dígitos verificadores,
ou seja, os dois últimos dígitos são criados
a partir dos nove primeiros. O cálculo é feito em
duas etapas utilizando o módulo de divisão 11.
Para exemplificar melhor, iremos calcular os dígitos
verificadores de um CPF imaginário, por exemplo, 222.333.666-XX.
Fazendo o cálculo do primeiro dígito
verificador
O primeiro dígito é calculado com
a distribuição dos dígitos colocando-se os
valores 10, 9, 8, 7, 6, 5, 4, 3, 2 conforme a representação
abaixo:
Números do CPF |
2 |
2 |
2 |
3 |
3 |
3 |
6 |
6 |
6 |
Valores definidos
para o calculo |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
Na seqüência multiplicaremos os valores
de cada coluna, confira:
Números do
CPF |
2 |
2 |
2 |
3 |
3 |
3 |
6 |
6 |
6 |
Valores definidos
para o calculo |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
Total |
20 |
18 |
16 |
21 |
18 |
15 |
24 |
18 |
12 |
Em seguida efetuaremos o somatório dos resultados
(20+18+...+18+12), o resultado obtido (162) será divido
por 11. Considere como quociente apenas o valor inteiro, o resto
da divisão será responsável pelo cálculo
do primeiro dígito verificador.
Vamos acompanhar: 162 dividido por 11 obtemos 14
de quociente e 8 de resto da divisão. Caso o resto da divisão
seja menor que 2, o nosso primeiro dígito verificador se
torna 0 (zero), caso contrário subtrai-se o valor obtido
de 11, que é nosso caso, sendo assim nosso dígito
verificador é 11-8, ou seja, 3 (três), já
temos parte do CPF, confira: 222.333.666-3X.
Fazendo o cálculo do segundo dígito
verificador
Para o cálculo do segundo dígito
será usado o primeiro dígito verificador já
calculado. Montaremos uma tabela semelhante à anterior,
só que desta vez usaremos na segunda linha os valores 11,
10, 9, 8, 7, 6, 5, 4, 3, 2, já que estamos incorporando
mais um algarismo para esse cálculo. Veja:
Números do
CPF |
2 |
2 |
2 |
3 |
3 |
3 |
6 |
6 |
6 |
3 |
Valores definidos
para o calculo |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
Na próxima etapa faremos como na situação
do cálculo do primeiro dígito verificador. Multiplicaremos
os valores de cada coluna e efetuaremos o somatório dos
resultados obtidos: 22+20+18+24+21+18+30+24+18+4=201.
Números do
CPF |
2 |
2 |
2 |
3 |
3 |
3 |
6 |
6 |
6 |
3 |
Valores definidos
para o calculo |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
Total |
22 |
20 |
18 |
24 |
21 |
18 |
30 |
24 |
18 |
6 |
Agora pegamos esse valor e dividimos por 11. Considere
novamente apenas o valor inteiro do quociente, e com o resto da
divisão, no nosso caso 3, usaremos para o cálculo
do segundo dígito verificador, assim como na primeira parte.
Caso o valor do resto da divisão seja menor
que 2, esse valor passa automaticamente a ser zero, que é
o nosso caso, caso contrário é necessário
subtrair o valor obtido de 11 para se obter o dígito verificador.
Neste caso chegamos ao final dos cálculos
e descobrimos que os dígitos verificadores do nosso CPF
hipotético são os números 3 e 8, portanto
o CPF ficaria assim: 222.333.666-38.
Exemplo pratico da validação
do CPF
Agora que já conhecemos como funciona o
algoritmo do CPF, vamos partir para a programação
do nosso código.
O nosso código é composto por uma
função que vai retornar um valor true ou false para
que o formulário seja enviado ou não. Abaixo do
código tem uma descrição para um melhor acompanhamento
e no fim da matéria um link para o exemplo desenvolvido
aqui.
Exemplo:
1 <script
language="Javascript">
2 function
validaCPF() {
3 cpf
= document.validacao.cpfID.value;
4 erro
= new String;
5 if
(cpf.length < 11) erro += "Sao necessarios 11 digitos
para verificacao do CPF! \n\n";
6 var
nonNumbers = /\D/;
7 if
(nonNumbers.test(cpf)) erro += "A verificacao de CPF suporta
apenas numeros! \n\n";
8 if
(cpf == "00000000000" || cpf == "11111111111"
|| cpf == "22222222222" || cpf == "33333333333"
|| cpf == "44444444444" || cpf == "55555555555"
|| cpf == "66666666666" || cpf == "77777777777"
|| cpf == "88888888888" || cpf == "99999999999"){
9 erro
+= "Numero de CPF invalido!"
10 }
11 var
a = [];
12 var
b = new Number;
13 var
c = 11;
14 for
(i=0; i<11; i++){
15 a[i]
= cpf.charAt(i);
16 if
(i < 9) b += (a[i] * --c);
17 }
18 if
((x = b % 11) < 2) { a[9] = 0 } else
{ a[9] = 11-x }
19 b
= 0;
20 c
= 11;
21 for
(y=0; y<10; y++) b += (a[y] * c--);
22 if
((x = b % 11) < 2) { a[10] = 0; } else
{ a[10] = 11-x; }
23 if
((cpf.charAt(9) != a[9]) || (cpf.charAt(10)
!= a[10])){
24 erro
+="Digito verificador com problema!";
25 }
26 if
(erro.length > 0){
27 alert(erro);
28 return
false;
29 }
30 return
true;
31 }
32 </script>
Linha 3 – Declaração
da variável cpf responsável por recuperar o valor
da text box que tem o numero do CPF.
Linha 4 – Declaração
da variável erro como nova String responsável por
salvar os erros que aconteçam na validação.
Linha 5 – Verificação
se o tamanho da variável cpf é menor que 11 caracteres.
Se retornar true, a variável erro é acrescida de
um texto referente ao erro.
Linha 6 – Declaração
da variável nonNumbers responsável por conter o
valor para a checagem utilizando Regular Expression.
Linha 7 – Verificação
se a variável CPF contém caracteres que não
são números. Se retornar true, a variável
erro é acrescida de um texto referente ao erro.
Linha 8 – Verificação
se a variável CPFé igual a 11 caracteres repetidos
que vão de 0 a 9. Se retornar true, a variável erro
é acrescida de um texto referente ao erro.
Linha 11 - Declaração
da variável a como uma matriz usando literal notation.
Linha 12 - Declaração
da variável b como novo número.
Linha 13 - Declaração
da variável c como o valor igual a 11.
Linha 14 – Loop
que vai ser executado 11 vezes.
Linha 15 – A
matriz a indexada do valor da variável do loop recebe o
caractere da variável CPF indexado do valor da variável
do loop.
Linha 16 – Verificação
se o valor de i é menor que 9. Se retornar true a variável
b, é acrescida do valor da matriz a indexada do valor da
variável do loop multiplicada pelo valor decrescido da
variável c.
Linha 18 – Verificação
se a variável x (que tem o valor do resto da divisão
de b por 11) é menor que 2. Se retornar true, a matriz
a indexada de 9 recebe o valor de 0. Se retornar false a matriz
a indexada de 9 recebe o valor de 11 menos o valor de x.
Linha 19 e 20 –
As variáveis b e c são reiniciadas.
Linha 21 – Loop
que vai ser executado 10 vezes. A variável b é acrescida
do valor da matriz a indexada do valor da variável do loop
multiplicada pelo valor da variável c decrescido.
Linha 22 – Verificação
se a variável x (que tem o valor do resto da divisão
de b por 11) é menor que 2. Se retornar true a matriz a
indexada de 10 recebe o valor de 0. Se retornar false a matriz
a indexada de 10 recebe o valor de 11 menos o valor de x.
Linha 23 – Verificação
se a variável cpf indexada de 9 é diferente da matriz
a indexada de 9 e se a variável CPF indexada de 10 é
diferente da matriz a indexada de 10. Se retornar true a variável
erro é acrescida de um texto referente ao erro.
Linha 26 – Verificação
se o tamanho da variável erro é maior que 0, se
retornar true uma caixa de alerta é mostrada ao usuário
com o(s) erro(s) da validação. O formulário
retorna falso e não é enviado.
Linha 30 – A
função retorna true, com isso o formulário
é enviado com sucesso.
Como a função validaCPF pronta vamos
partir para a parte HTML para criar o formulário que suportara
o caixa de texto para digitar o numero do CPF. O evento onSubmit
do formulário é usado para retornar um valor para
verificar se o mesmo vai ser enviado ou nao.
Exemplo:
1 <form action="validaCPF.htm"
name="validacao" onSubmit="return validaCPF()">
2 <input
type="text" name="cpfID" id="cpfID"
maxlength="11" value="">
3 <input
name="Submit" type="submit" value="enviar">
4 </form>
5 Digite o numero do CPF sem utilizar os caracteres
"." ou "-".
Com essa explicação você poderá
montar sua própria rotina ou utilizar a que criamos, abaixo
segue o link para o exemplo criado aqui.
Confira o exemplo do código: validaCPF.htm
Link da Materia Original
|