Algoritmo do CPF Vamos entender um pouo omo funiona o algoritmo do CPF! "a primeira parte estudaremos o funionamento do #lulo do CPF para $alidar os d%gitos $erifiadores &ue fa'em a diferenia()o de um CPF para outro! *ogo a+aixo segue um ,digo &ue fa' a $alida()o do CPF, mas mesmo &ue $o- &ueria desen$ol$er o seu pr,prio ,digo, em .a$asript ou outra linguagem, a+aixo segue uma +re$e explia()o! /sse algoritmo &ue 0 respons#$el pela $alida()o do CPF foi feito de aordo om a regras do 1inist0rio da Fa'enda! Conhecendo o clculo do algoritmo do CPF 2 CPF 0 omposto por on'e algarismos, onde os dois 3ltimos s)o hamados de d%gitos $erifiadores, ou se.a, os dois 3ltimos d%gitos s)o riados a partir dos no$e primeiros! 2 #lulo 0 feito em duas etapas utili'ando o m,dulo de di$is)o 44! Para exemplifiar melhor, iremos alular os d%gitos $erifiadores de um CPF imagin#rio, por exemplo, 222!555!666-66! Fazendo o clculo do primeiro dgito verificador 2 primeiro d%gito 0 alulado om a distri+ui()o dos d%gitos oloando-se os $alores 40, 7, 8, 9, 6, :, 4, 5, 2 onforme a representa()o a+aixo; "3meros do CPF 2 2 2 5 5 5 6 6 6 Valores definidos para o alulo 40 7 8 9 6 : 4 5 2 "a se&<-nia multipliaremos os $alores de ada oluna, onfira; "3meros do CPF 2 2 2 5 5 5 6 6 6 Valores definidos para o alulo 40 7 8 9 6 : 4 5 2 Total 20 48 46 24 48 4: 24 48 42 /m seguida efetuaremos o somat,rio dos resultados =20>48>!!!>48>42?, o resultado o+tido =462? ser# di$ido por 44! Considere omo &uoiente apenas o $alor inteiro, o resto da di$is)o ser# respons#$el pelo #lulo do primeiro d%gito $erifiador! Vamos aompanhar; 462 di$idido por 44 o+temos 44 de &uoiente e 8 de resto da di$is)o! Caso o resto da di$is)o se.a menor &ue 2, o nosso primeiro d%gito $erifiador se torna 0 ='ero?, aso ontr#rio su+trai-se o $alor o+tido de 44, &ue 0 nosso aso, sendo assim nosso d%gito $erifiador 0 44-8, ou se.a, 5 =tr-s?, .# temos parte do CPF, onfira; 222!555!666-56! Fazendo o clculo do segundo dgito verificador Para o #lulo do segundo d%gito ser# usado o primeiro d%gito $erifiador .# alulado! 1ontaremos uma ta+ela semelhante @ anterior, s, &ue desta $e' usaremos na segunda linha os $alores 44, 40, 7, 8, 9, 6, :, 4, 5, 2, .# &ue estamos inorporando mais um algarismo para esse #lulo! Ve.a; "3meros do CPF 2 2 2 5 5 5 6 6 6 5 Valores definidos para o alulo 44 40 7 8 9 6 : 4 5 2 "a pr,xima etapa faremos omo na situa()o do #lulo do primeiro d%gito $erifiador! 1ultipliaremos os $alores de ada oluna e efetuaremos o somat,rio dos resultados o+tidos; 22>20>48>24>24>48>50>24>48>4A204! "3meros do CPF 2 2 2 5 5 5 6 6 6 5 Valores definidos para o alulo 44 40 7 8 9 6 : 4 5 2 Total 22 20 48 24 24 48 50 24 48 6 Agora pegamos esse $alor e di$idimos por 44! Considere no$amente apenas o $alor inteiro do &uoiente, e om o resto da di$is)o, no nosso aso 5, usaremos para o #lulo do segundo d%gito $erifiador, assim omo na primeira parte! Caso o $alor do resto da di$is)o se.a menor &ue 2, esse $alor passa automatiamente a ser 'ero, &ue 0 o nosso aso, aso ontr#rio 0 neess#rio su+trair o $alor o+tido de 44 para se o+ter o d%gito $erifiador! "este aso hegamos ao final dos #lulos e deso+rimos &ue os d%gitos $erifiadores do nosso CPF hipot0tio s)o os n3meros 5 e 8, portanto o CPF fiaria assim; 222!555!666-58! Exemplo pratico da validao do CPF Agora &ue .# onheemos omo funiona o algoritmo do CPF, $amos partir para a programa()o do nosso ,digo! 2 nosso ,digo 0 omposto por uma fun()o &ue $ai retornar um $alor true ou false para &ue o formul#rio se.a en$iado ou n)o! A+aixo do ,digo tem uma desri()o para um melhor aompanhamento e no fim da mat0ria um linB para o exemplo desen$ol$ido a&ui! Exemplo: 1 Csript languageADEa$asriptDF function $alidaCPF=? G ! pf A doument!$alidaao!pfHI!$alueJ " erro A neK StringJ # if =pf!length C 44? erro >A DSao neessarios 44 digitos para $erifiaao do CPFL DJ $ $ar non"um+ers A MNIMJ % if =non"um+ers!test=pf?? erro >A DA $erifiaao de CPF suporta apenas numerosL DJ & if =pf AA D00000000000D OO pf AA D44444444444D OO pf AA D22222222222D OO pf AA D55555555555D OO pf AA D44444444444D OO pf AA D:::::::::::D OO pf AA D66666666666D OO pf AA D99999999999D OO pf AA D88888888888D OO pf AA D77777777777D?G ' erro >A D"umero de CPF in$alidoLD 1( P 11 $ar a A QRJ 1 $ar + A neK "um+erJ 1! $ar A 44J 1" for =iA0J iC44J i>>?G 1# aQiR A pf!harAt=i?J 1$ if =i C 7? + >A =aQiR S --?J 1% P 1& if ==x A + T 44? C 2? G aQ7R A 0 P else G aQ7R A 44-x P 1' + A 0J ( A 44J 1 for =UA0J UC40J U>>? + >A =aQUR S --?J if ==x A + T 44? C 2? G aQ40R A 0J P else G aQ40R A 44-xJ P ! if ==pf!harAt=7? LA aQ7R? OO =pf!harAt=40? LA aQ40R??G " erro >ADIigito $erifiador om pro+lemaLDJ # P $ if =erro!length F 0?G % alert=erro?J & return falseJ ' P !( return trueJ !1 P ! CMsriptF *inha 5 V Ielara()o da $ari#$el pf respons#$el por reuperar o $alor da text +ox &ue tem o numero do CPF! *inha 4 V Ielara()o da $ari#$el erro omo no$a String respons#$el por sal$ar os erros &ue aonte(am na $alida()o! *inha : V Verifia()o se o tamanho da $ari#$el pf 0 menor &ue 44 arateres! Se retornar true, a $ari#$el erro 0 aresida de um texto referente ao erro! *inha 6 V Ielara()o da $ari#$el non"um+ers respons#$el por onter o $alor para a heagem utili'ando Wegular /xpression! *inha 9 V Verifia()o se a $ari#$el CPF ont0m arateres &ue n)o s)o n3meros! Se retornar true, a $ari#$el erro 0 aresida de um texto referente ao erro! *inha 8 V Verifia()o se a $ari#$el CPF0 igual a 44 arateres repetidos &ue $)o de 0 a 7! Se retornar true, a $ari#$el erro 0 aresida de um texto referente ao erro! *inha 44 - Ielara()o da $ari#$el a omo uma matri' usando literal notation! *inha 42 - Ielara()o da $ari#$el + omo no$o n3mero! *inha 45 - Ielara()o da $ari#$el omo o $alor igual a 44! *inha 44 V *oop &ue $ai ser exeutado 44 $e'es! *inha 4: V A matri' a indexada do $alor da $ari#$el do loop ree+e o aratere da $ari#$el CPF indexado do $alor da $ari#$el do loop! *inha 46 V Verifia()o se o $alor de i 0 menor &ue 7! Se retornar true a $ari#$el +, 0 aresida do $alor da matri' a indexada do $alor da $ari#$el do loop multipliada pelo $alor deresido da $ari#$el ! *inha 48 V Verifia()o se a $ari#$el x =&ue tem o $alor do resto da di$is)o de + por 44? 0 menor &ue 2! Se retornar true, a matri' a indexada de 7 ree+e o $alor de 0! Se retornar false a matri' a indexada de 7 ree+e o $alor de 44 menos o $alor de x! *inha 47 e 20 V As $ari#$eis + e s)o reiniiadas! *inha 24 V *oop &ue $ai ser exeutado 40 $e'es! A $ari#$el + 0 aresida do $alor da matri' a indexada do $alor da $ari#$el do loop multipliada pelo $alor da $ari#$el deresido! *inha 22 V Verifia()o se a $ari#$el x =&ue tem o $alor do resto da di$is)o de + por 44? 0 menor &ue 2! Se retornar true a matri' a indexada de 40 ree+e o $alor de 0! Se retornar false a matri' a indexada de 40 ree+e o $alor de 44 menos o $alor de x! *inha 25 V Verifia()o se a $ari#$el pf indexada de 7 0 diferente da matri' a indexada de 7 e se a $ari#$el CPF indexada de 40 0 diferente da matri' a indexada de 40! Se retornar true a $ari#$el erro 0 aresida de um texto referente ao erro! *inha 26 V Verifia()o se o tamanho da $ari#$el erro 0 maior &ue 0, se retornar true uma aixa de alerta 0 mostrada ao usu#rio om o=s? erro=s? da $alida()o! 2 formul#rio retorna falso e n)o 0 en$iado! *inha 50 V A fun()o retorna true, om isso o formul#rio 0 en$iado om suesso! Como a fun()o $alidaCPF pronta $amos partir para a parte XT1* para riar o formul#rio &ue suportara o aixa de texto para digitar o numero do CPF! 2 e$ento onSu+mit do formul#rio 0 usado para retornar um $alor para $erifiar se o mesmo $ai ser en$iado ou nao! Exemplo: 1 Cform ationAD$alidaCPF!htmD nameAD$alidaaoD onSu+mitADreturn $alidaCPF=?DF Cinput tUpeADtextD nameADpfHID idADpfHID maxlengthAD44D $alueADDF ! Cinput nameADSu+mitD tUpeADsu+mitD $alueADen$iarDF " CMformF # Iigite o numero do CPF sem utili'ar os arateres D!D ou D-D! Com essa explia()o $o- poder# montar sua pr,pria rotina ou utili'ar a &ue riamos, a+aixo segue o linB para o exemplo riado a&ui! Confira o exemplo do ,digo; $alidaCPF!htm