Você está na página 1de 4

Javascript

Algoritmo do CPF
Sexta-feira, 06/08/2004 s 15h09, por Thiago Prado

Vamos entender um pouco como funciona o algoritmo do CPF. Na primeira parte estudaremos o funcionamento do clculo do CPF para validar os dgitos verificadores que fazem a diferenciao de um CPF para outro. Logo abaixo segue um cdigo que faz a validao do CPF, mas mesmo que voc queria desenvolver o seu prprio cdigo, em javascript ou outra linguagem, abaixo segue uma breve explicao. Esse algoritmo que responsvel pela validao do CPF foi feito de acordo com a regras do Ministrio da Fazenda. Conhecendo o clculo do algoritmo do CPF O CPF composto por onze algarismos, onde os dois ltimos so chamados de dgitos verificadores, ou seja, os dois ltimos dgitos so criados a partir dos nove primeiros. O clculo feito em duas etapas utilizando o mdulo de diviso 11. Para exemplificar melhor, iremos calcular os dgitos verificadores de um CPF imaginrio, por exemplo, 222.333.666-XX. Fazendo o clculo do primeiro dgito verificador O primeiro dgito calculado com a distribuio dos dgitos colocando-se os valores 10, 9, 8, 7, 6, 5, 4, 3, 2 conforme a representao abaixo:

Nmeros do CPF

2 9

2 8

3 7

3 6

3 5

6 4

6 3

6 2

Valores definidos 10 para o calculo

Na seqncia multiplicaremos os valores de cada coluna, confira:

Nmeros 2 do CPF Valores 10 definidos para o calculo Total 20

2 9

2 8

3 7

3 6

3 5

6 4

6 3

6 2

18

16

21

18

15

24

18

12

Em seguida efetuaremos o somatrio dos resultados (20+18+...+18+12), o resultado obtido (162) ser divido por 11. Considere como quociente apenas o valor inteiro, o resto da diviso ser responsvel pelo clculo do primeiro dgito verificador. Vamos acompanhar: 162 dividido por 11 obtemos 14 de quociente e 8 de resto da diviso. Caso o resto da diviso seja menor que 2, o nosso primeiro dgito verificador se torna 0 (zero), caso contrrio subtrai-se o valor obtido de 11, que nosso caso, sendo assim nosso dgito verificador 11-8, ou seja, 3 (trs), j temos parte do CPF, confira: 222.333.666-3X. Fazendo o clculo do segundo dgito verificador

Para o clculo do segundo dgito ser usado o primeiro dgito 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 clculo. Veja:

Nmeros do 2 CPF Valores 11 definidos para o calculo

2 10

2 9

3 8

3 7

3 6

6 5

6 4

6 3

3 2

Na prxima etapa faremos como na situao do clculo do primeiro dgito verificador. Multiplicaremos os valores de cada coluna e efetuaremos o somatrio dos resultados obtidos: 22+20+18+24+21+18+30+24+18+4=201.

Nmeros 2 do CPF Valores 11 definidos para o calculo Total 22

2 10

2 9

3 8

3 7

3 6

6 5

6 4

6 3

3 2

20

18

24

21

18

30

24

18

Agora pegamos esse valor e dividimos por 11. Considere novamente apenas o valor inteiro do quociente, e com o resto da diviso, no nosso caso 3, usaremos para o clculo do segundo dgito verificador, assim como na primeira parte. Caso o valor do resto da diviso seja menor que 2, esse valor passa automaticamente a ser zero, que o nosso caso, caso contrrio necessrio subtrair o valor obtido de 11 para se obter o dgito verificador. Neste caso chegamos ao final dos clculos e descobrimos que os dgitos verificadores do nosso CPF hipottico so os nmeros 3 e 8, portanto o CPF ficaria assim: 222.333.666-38. Exemplo pratico da validao do CPF Agora que j conhecemos como funciona o algoritmo do CPF, vamos partir para a programao do nosso cdigo. O nosso cdigo composto por uma funo que vai retornar um valor true ou false para que o formulrio seja enviado ou no. Abaixo do cdigo tem uma descrio para um melhor acompanhamento e no fim da matria 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 Declarao da varivel cpf responsvel por recuperar o valor da text box que tem o numero do CPF. Linha 4 Declarao da varivel erro como nova String responsvel por salvar os erros que aconteam na validao. Linha 5 Verificao se o tamanho da varivel cpf menor que 11 caracteres. Se retornar true, a varivel erro acrescida de um texto referente ao erro. Linha 6 Declarao da varivel nonNumbers responsvel por conter o valor para a checagem utilizando Regular Expression. Linha 7 Verificao se a varivel CPF contm caracteres que no so nmeros. Se retornar true, a varivel erro acrescida de um texto referente ao erro. Linha 8 Verificao se a varivel CPF igual a 11 caracteres repetidos que vo de 0 a 9. Se retornar true, a varivel erro acrescida de um texto referente ao erro. Linha 11 - Declarao da varivel a como uma matriz usando literal notation. Linha 12 - Declarao da varivel b como novo nmero. Linha 13 - Declarao da varivel 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 varivel do loop recebe o caractere da varivel CPF indexado do valor da varivel do loop. Linha 16 Verificao se o valor de i menor que 9. Se retornar true a varivel b, acrescida do valor da matriz a indexada do valor da varivel do loop multiplicada pelo valor decrescido da varivel c. Linha 18 Verificao se a varivel x (que tem o valor do resto da diviso 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 variveis b e c so reiniciadas. Linha 21 Loop que vai ser executado 10 vezes. A varivel b acrescida do valor da matriz a indexada do valor da varivel do loop multiplicada pelo valor da varivel c decrescido. Linha 22 Verificao se a varivel x (que tem o valor do resto da diviso 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 Verificao se a varivel cpf indexada de 9 diferente da matriz a indexada de 9 e se a varivel CPF indexada de 10 diferente da matriz a indexada de 10. Se retornar true a varivel erro acrescida de um texto referente ao erro. Linha 26 Verificao se o tamanho da varivel erro maior que 0, se retornar true uma caixa de alerta mostrada ao usurio com o(s) erro(s) da validao. O formulrio retorna falso e no enviado. Linha 30 A funo retorna true, com isso o formulrio enviado com sucesso. Como a funo validaCPF pronta vamos partir para a parte HTML para criar o formulrio que suportara o caixa de texto para digitar o numero do CPF. O evento onSubmit do formulrio 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 explicao voc poder montar sua prpria rotina ou utilizar a que criamos, abaixo segue o link para o exemplo criado aqui. Confira o exemplo do cdigo: validaCPF.htm

Você também pode gostar