Eae galera!
Existe um algoritmo pronto e funcionando, feito nas regras do Ministério da Fazenda para se calcular o CPF de uma pessoa. Este algoritmo verifica se o CPF indicado é ou não um CPF válido.
Algoritmo do CPF em PHP
Quando eu pesquisei este algoritmo, confesso que não botei muita fé e fiz o teste de mesa pra ver se funcionava mesmo, e como vocês podem ver, a qualidade do algoritmo é comprovada!
Segue abaixo um CTRL+V de um artigo muito bom que eu achei no iMasters explicando direitinho o funcionamento do cálculo do CPF:
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.
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 não.
Exemplo:
<form action="validaCPF.htm" name="validacao" onSubmit="return validaCPF()">
<input type="text" name="cpfID" id="cpfID" maxlength="11" value="">
<input name="Submit" type="submit" value="enviar">
</form>
Digite o numero do CPF sem utilizar os caracteres "." ou "-".
Seguindo os passos deste tutorial, você vai conseguir fazer um código validador de cpf sem problemas! Créditos à galera do iMasters, que fez o artigo que eu copiei e pode ser lido na íntegra (aqui no blog, hehehe) ou no próprio site deles, que é >> http://imasters.com.br/artigo/2410/javascript/algoritmo_do_cpf/
Att,
sanoj
😉
Muito bom o tutorial mais um pequeno trecho passou despercebido
“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.”
no exemplo do tutorial o 2º digito verificador é 3 e nao menor que 2 como você mencionou nesse trecho!
no mais o tutorial está perfeito e muito bem explicado…
att,
Raphael Neumann
Vlw ae a contribuição Raphael!
sempre que achar algo estranho, não deixe de comentar!
😉