[Rio-pm] Verificador CPF/CGC/CNPJ

breno breno em rio.pm.org
Terça Maio 1 17:02:01 PDT 2007


Pessoal, olha a vergonha!!!

Achei na Internet um verificador em Java de CPF ***E*** CGC/CNPJ com apenas
35 linhas, incluindo espaços e "fecha-chaves". Procurando no CPAN, encontrei
um módulo de verificação de CPF com 29 linhas (sem contar os espaços!) e um
de CGC/CNPJ com 76 (!!!!) linhas, também sem contar os espaços...

O que acham de fazermos uma versão mais eficiente (e de preferencia mais
enxuta) desses verificadores em Perl, hein?!

Tá lançado o desafio (e possível golfe em paralelo) para a comunidade!!! O
melhor código vai pro novo site, e de repente até pro CPAN!!!

[]s

-b

Para os que ficaram interessados, os links para os módulos do CPAN (do Paul
Hodel) estão em:
http://search.cpan.org/~hodel/Brasil-Checar-CPF-1.01a/Checar/CPF/CPF.pm
<http://search.cpan.org/%7Ehodel/Brasil-Checar-CPF-1.01a/Checar/CPF/CPF.pm>
http://search.cpan.org/~hodel/Brasil-Checar-CGC-1.01a/Checar/CGC/CGC.pm<http://search.cpan.org/%7Ehodel/Brasil-Checar-CGC-1.01a/Checar/CGC/CGC.pm>

Antes de enviar esse email procurei um pouco mais pelo CPAN e encontrei os
módulos do Adriano Ferreira, que parecem mais enxutos e podem ser
vistos/usados em:
http://search.cpan.org/src/FERREIRA/Business-BR-Ids-0.00_16/lib/Business/BR/CPF.pm
http://search.cpan.org/~ferreira/Business-BR-Ids-0.00_16/lib/Business/BR/CNPJ.pm<http://search.cpan.org/%7Eferreira/Business-BR-Ids-0.00_16/lib/Business/BR/CNPJ.pm>

e o código em Java segue abaixo:
-----------8<-----------
public class CNP {
   private static final int[] pesoCPF = {11, 10, 9, 8, 7, 6, 5, 4, 3, 2};
   private static final int[] pesoCNPJ = {6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4,
3, 2};

   private static int calcularDigito(String str, int[] peso) {
      int soma = 0;
      for (int indice=str.length()-1, digito; indice >= 0; indice-- ) {
         digito = Integer.parseInt(str.substring(indice,indice+1));
         soma += digito*peso[peso.length-str.length()+indice];
      }
      soma = 11 - soma % 11;
      return soma > 9 ? 0 : soma;
   }

   public static boolean isValidCPF(String cpf) {
      if ((cpf==null) || (cpf.length()!=11)) return false;

      Integer digito1 = calcularDigito(cpf.substring(0,9), pesoCPF);
      Integer digito2 = calcularDigito(cpf.substring(0,9) + digito1,
pesoCPF);
      return cpf.equals(cpf.substring(0,9) + digito1.toString() +
digito2.toString());
   }

   public static boolean isValidCNPJ(String cnpj) {
      if ((cnpj==null)||(cnpj.length()!=14)) return false;

      Integer digito1 = calcularDigito(cnpj.substring(0,12), pesoCNPJ);
      Integer digito2 = calcularDigito(cnpj.substring(0,12) + digito1,
pesoCNPJ);
      return cnpj.equals(cnpj.substring(0,12) + digito1.toString() +
digito2.toString());
   }

   public static void main(String[] args) {
      System.out.printf("CPF Valido:%s \n", CNP.isValidCPF("01115375502"));
      System.out.printf("CNPJ Valido:%s \n",
CNP.isValidCNPJ("13642634756318"));

   }
}
------------8<-----------------
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://mail.pm.org/pipermail/rio-pm/attachments/20070501/af58098b/attachment.html 


Mais detalhes sobre a lista de discussão Rio-pm