Excelente, Adriano! <br><br>E vc já comparou o algoritmo do CheckDigits com o seu?<br><br>Aliás, pode dar uma explanada geral sobre onde as fórmulas foram encontradas? Isto é, quais seriam os testes típicos para essa entrada? Digo isso pois alguns verificadores ignoram as entradas "canônicas" como "
111.111.111-11", por exemplo. Existem outras desse tipo? Nos seus arquivos de testes do BR::Ids tem comparações de 10 CPFs válidos, mas a verificação aleatória testa muito mais se não me engano (por isso perguntei).<br>
<br>Puxa, será que o Paul e o Mathias estão na Rio-PM tb? Ia ser uma discussão interessante ;-)<br><br>[]s<br><br>-b<br><br><div><span class="gmail_quote">On 5/2/07, <b class="gmail_sendername">Adriano Ferreira</b> <<a href="mailto:a.r.ferreira@gmail.com">
a.r.ferreira@gmail.com</a>> wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Além dos módulos que você encontrou tem também<br>
<br><a href="http://search.cpan.org/~mamawe/Algorithm-CheckDigits-0.44/CheckDigits/M11_004.pm">http://search.cpan.org/~mamawe/Algorithm-CheckDigits-0.44/CheckDigits/M11_004.pm</a><br><br>que consegue tratar CPFs e título eleitoral.
<br><br>On 5/2/07, Adriano Ferreira <<a href="mailto:a.r.ferreira@gmail.com">a.r.ferreira@gmail.com</a>> wrote:<br>> On 5/1/07, breno <<a href="mailto:breno@rio.pm.org">breno@rio.pm.org</a>> wrote:<br>> > Pessoal, olha a vergonha!!!
<br>> ><br>> > Achei na Internet um verificador em Java de CPF ***E*** CGC/CNPJ com apenas<br>> > 35 linhas, incluindo espaços e "fecha-chaves". Procurando no CPAN, encontrei<br>> > um módulo de verificação de CPF com 29 linhas (sem contar os espaços!) e um
<br>> > de CGC/CNPJ com 76 (!!!!) linhas, também sem contar os espaços...<br>> ><br>> > O que acham de fazermos uma versão mais eficiente (e de preferencia mais<br>> > enxuta) desses verificadores em Perl, hein?!
<br>> ><br>> > Tá lançado o desafio (e possível golfe em paralelo) para a comunidade!!! O<br>> > melhor código vai pro novo site, e de repente até pro CPAN!!!<br>> ><br>> > []s<br>> ><br>
> > -b<br>> ><br>> > Para os que ficaram interessados, os links para os módulos do CPAN (do Paul<br>> > Hodel) estão em:<br>> > <a href="http://search.cpan.org/~hodel/Brasil-Checar-CPF-1.01a/Checar/CPF/CPF.pm">
http://search.cpan.org/~hodel/Brasil-Checar-CPF-1.01a/Checar/CPF/CPF.pm</a><br>> > <a href="http://search.cpan.org/~hodel/Brasil-Checar-CGC-1.01a/Checar/CGC/CGC.pm">http://search.cpan.org/~hodel/Brasil-Checar-CGC-1.01a/Checar/CGC/CGC.pm
</a><br>> ><br>> > Antes de enviar esse email procurei um pouco mais pelo CPAN e encontrei os<br>> > módulos do Adriano Ferreira, que parecem mais enxutos e podem ser<br>> > vistos/usados em:<br>> >
<a href="http://search.cpan.org/src/FERREIRA/Business-BR-Ids-0.00_16/lib/Business/BR/CPF.pm">http://search.cpan.org/src/FERREIRA/Business-BR-Ids-0.00_16/lib/Business/BR/CPF.pm</a><br>> > <a href="http://search.cpan.org/~ferreira/Business-BR-Ids-0.00_16/lib/Business/BR/CNPJ.pm">
http://search.cpan.org/~ferreira/Business-BR-Ids-0.00_16/lib/Business/BR/CNPJ.pm</a><br>><br>> Bem, o código para verificar se um CNPJ é válido no Business::BR::CNPJ é<br>><br>> sub test_cnpj {<br>> my $cnpj = canon_cnpj shift;
<br>> return undef if length $cnpj != 14;<br>> my @cnpj = split '', $cnpj;<br>> my $s1 = _dot([5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0], \@cnpj) % 11;<br>> my $s2 = _dot([6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2, 1], \@cnpj) % 11;
<br>> unless ($s1==0 || $s1==1 && $cnpj[12]==0) {<br>> return 0;<br>> }<br>> return ($s2==0 || $s2==1 && $cnpj[13]==0) ? 1 : 0;<br>> }<br>><br>> que usa "canon_cnpj" para permitir usar CNPJs formatados
<br>> "11.111.111/0001-29" ou não e "_dot" para calcular a soma ponderada. O<br>> módulo de CPF é análogo.<br>><br>> O resto do código dos módulos faz um pouco mais do que este teste de<br>
> dígitos de verificação.<br>><br>> Mais importante que o tamanho do código é a facilidade do uso. Eu<br>> particularmente gosto de usar a interface oferecida por<br>> Business::BR::Ids onde você pode testar CNPJs, CPFs, números de PIS e
<br>> algumas inscrições estaduais com um código como:<br>><br>> use Business::BR::Ids qw(test_id);<br>><br>> $ok = test_id( 'cnpj', '28.282.192/0001-23');<br>> $ok = test_id( 'cpf', '
28.818.188-00' );<br>> $ok = test_id( 'pis', '19.2992.2920-00');<br>> $ok = test_id( 'ie', 'PR', '82902020802');<br>><br>><br>> ><br>> > e o código em Java segue abaixo:
<br>> > -----------8<-----------<br>> > public class CNP {<br>> > private static final int[] pesoCPF = {11, 10, 9, 8, 7, 6, 5, 4, 3, 2};<br>> > private static final int[] pesoCNPJ = {6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4,
<br>> > 3, 2};<br>> ><br>> > private static int calcularDigito(String str, int[] peso) {<br>> > int soma = 0;<br>> > for (int indice=str.length()-1, digito; indice >= 0; indice-- ) {
<br>> > digito = Integer.parseInt(str.substring(indice,indice+1));<br>> > soma += digito*peso[peso.length-str.length()+indice];<br>> > }<br>> > soma = 11 - soma % 11;
<br>> > return soma > 9 ? 0 : soma;<br>> > }<br>> ><br>> > public static boolean isValidCPF(String cpf) {<br>> > if ((cpf==null) || (cpf.length()!=11)) return false;<br>
> ><br>> > Integer digito1 = calcularDigito(cpf.substring(0,9), pesoCPF);<br>> > Integer digito2 = calcularDigito(cpf.substring(0,9) + digito1,<br>> > pesoCPF);<br>> > return
cpf.equals(cpf.substring(0,9) + digito1.toString() +<br>> > digito2.toString());<br>> > }<br>> ><br>> > public static boolean isValidCNPJ(String cnpj) {<br>> > if ((cnpj==null)||(
cnpj.length()!=14)) return false;<br>> ><br>> > Integer digito1 = calcularDigito(cnpj.substring(0,12), pesoCNPJ);<br>> > Integer digito2 = calcularDigito(cnpj.substring(0,12) + digito1,<br>
> > pesoCNPJ);<br>> > return cnpj.equals(cnpj.substring(0,12) + digito1.toString() +<br>> > digito2.toString());<br>> > }<br>> ><br>> > public static void main(String[] args) {
<br>> > System.out.printf("CPF Valido:%s \n", CNP.isValidCPF("01115375502"));<br>> > System.out.printf("CNPJ Valido:%s \n",<br>> > CNP.isValidCNPJ("13642634756318"));
<br>> > }<br>> > }<br>> > ------------8<-----------------<br>> ><br>> > _______________________________________________<br>> > Rio-pm mailing list<br>> > <a href="mailto:Rio-pm@pm.org">
Rio-pm@pm.org</a><br>> > <a href="http://mail.pm.org/mailman/listinfo/rio-pm">http://mail.pm.org/mailman/listinfo/rio-pm</a><br>> ><br>><br>_______________________________________________<br>Rio-pm mailing list
<br><a href="mailto:Rio-pm@pm.org">Rio-pm@pm.org</a><br><a href="http://mail.pm.org/mailman/listinfo/rio-pm">http://mail.pm.org/mailman/listinfo/rio-pm</a><br></blockquote></div><br>