Código para validar CPF e CNPJ otimizado

Publicado por Carlos Caldas 30/04/2007

[ Hits: 58.173 ]

Homepage: www.ccaldas.com.br

Download CNP.java




Esse código difere da maioria dos códigos encontrados na internet.

Identifiquei um padrão no cálculo que evita um amontoado de IF´s e torna o código mais elegante.

Foi possivel criar as duas funções com aproximadamente 30 linhas.

  



Esconder código-fonte

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")); 
   }
}

Scripts recomendados

Determinante de uma matriz de ordem 3.

Exemplo de sobrecarga de métodos

Calculadora simples

Um classe que facilita a leitura de dados do teclahdo

Ordenação de vetores com letras do alfabeto


  

Comentários
[1] Comentário enviado por AlvimIgor em 24/03/2016 - 21:46h

Aqui está dando CPF inválido em todos os testes...
Como resolvo?

[2] Comentário enviado por yurisbv em 20/11/2016 - 16:10h

Muito legal !

Parabéns.

Podem testar o código aqui compilejava.net , só copiar e colar por cima do que está lá.

[3] Comentário enviado por janserlemesf em 10/06/2019 - 13:07h

A validação não está correta, por exemplo, para o valor cd cpf "11111111111" é retornado true


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts