Valida CPF

Boa tarde galera, tudo bem ?

Criei um classe que faz a validação do CPF e obtém também os dígitos verificadores. Eu sei que já existem diversas implementações de como validar um cpf e com certeza melhores do que esta, mas, não custa nada colocar mais uma né, pode ser útil pra alguém.

package validacao;

/**
 * Classe para validação de CPF e a obtenção dos digítos verificadores.
 *
 * @author $efcjunior$
 * @version $Revision: 1.1 $
 */
public class CPFUtil
{
   private static final int TAM_CPF = 11;
   private Integer primeiroDigito;
   private Integer segundoDigito;
   private String algarismoCpf;
   private String cpf;
   private String digitosVerificadores;
   private boolean valido;

   /**
    * Cria uma nova instância do tipo CPF.
    *
    * @param cpf argumento recebido.
    */
   public CPFUtil(String cpf)
   {
      this.cpf = cpf;
      this.algarismoCpf = isCPFComDigito() ? obtemAlgarismoComDigito() : obtemAlgarismoSemDigito();
      this.primeiroDigito = calculaPrimeiroDigitoVerificador();
      this.segundoDigito = calculaSegundoDigitoVerificador();
      this.digitosVerificadores = concatenaDigitos();
      this.valido = isCPFComDigito() ? validaCPF() : false;
   }

   /**
    * Recupera somente os 9 primeiros algarismo.
    *
    * @return somente os 9 primeiros algarismo.
    */
   public String getAlgarismoCpf()
   {
      return algarismoCpf;
   }

   /**
    * Recupera CPF conforme digitado.
    *
    * @return CPF conforme digitado.
    */
   public String getCpf()
   {
      return cpf;
   }

   /**
    * Recupera os dígitos verificadores.
    *
    * @return dígitos verificadores.
    */
   public String getDigitosVerificadores()
   {
      return digitosVerificadores;
   }

   /**
    * Recupera primeiro dígito verificador.
    *
    * @return primeiro dígito verificador.
    */
   public Integer getPrimeiroDigito()
   {
      return primeiroDigito;
   }

   /**
    * Recupera segundo dígito verificador.
    *
    * @return segundo dígito verificador.
    */
   public Integer getSegundoDigito()
   {
      return segundoDigito;
   }

   /**
    * Verifica se o CPF digitado é valido.
    *
    * @return CPF digitado é valido.
    */
   public boolean isValido()
   {
      return valido;
   }

   /**
    * Calcula o primeiro dígito.
    *
    * @return primeiro dígito.
    */
   private Integer calculaPrimeiroDigitoVerificador()
   {
      String aux1 = algarismoCpf;
      String aux2 = "";
      Integer soma = new Integer(0);

      for (int i = 10; i >= 2; i--)
      {
         aux2 = aux1;
         soma += ((Integer.parseInt(aux2.substring(0, 1))) * i);
         aux1 = aux2.substring(1);
      }

      return resultaDigitoVerificador(soma);
   }

   /**
    * Calcula o segundo dígito.
    *
    * @return o segundo dígito.
    */
   private Integer calculaSegundoDigitoVerificador()
   {
      String aux1 = algarismoCpf + primeiroDigito;
      String aux2 = "";
      Integer soma = new Integer(0);

      for (int i = 11; i >= 2; i--)
      {
         aux2 = aux1;
         soma += ((Integer.parseInt(aux2.substring(0, 1))) * i);
         aux1 = aux2.substring(1);
      }

      return resultaDigitoVerificador(soma);
   }

   /**
    * Concatena o primeiro e o segundo dígito encontrado.
    *
    * @return dígitos concatenados.
    */
   private String concatenaDigitos()
   {
      return primeiroDigito + "" + segundoDigito;
   }

   /**
    * Verifica se o CPF é com dígito.
    *
    * @return verdadeiro ou falso.
    */
   private boolean isCPFComDigito()
   {
      if (cpf.contains("."))
      {
         if (cpf.contains("-"))
         {
            return true;
         }
         else
         {
            return false;
         }
      }
      else
      {
         if (cpf.length() < TAM_CPF)
         {
            return false;
         }
         else
         {
            return true;
         }
      }
   }

   /**
    * Obtem os algarismo com dígito.
    *
    * @return algarismo com dígito.
    */
   private String obtemAlgarismoComDigito()
   {
      if (cpf.length() > TAM_CPF)
      {
         return cpf.substring(0, 3) + cpf.substring(4, 7) + cpf.substring(8, 11);
      }
      else
      {
         return cpf.substring(0, 9);
      }
   }

   /**
    * Obtém os algarismo sem dígito.
    *
    * @return algarismo sem dígito.
    */
   private String obtemAlgarismoSemDigito()
   {
      if (cpf.length() < TAM_CPF)
      {
         return cpf;
      }
      else
      {
         return cpf.substring(0, 3) + cpf.substring(4, 7) + cpf.substring(8, 11);
      }
   }

   /**
    * Obtem o dígito verificador calculado.
    *
    * @param soma
    *
    * @return verificador calculado.
    */
   private Integer resultaDigitoVerificador(Integer soma)
   {
      Integer resto = soma % 11;

      if (resto < 2)
      {
         return 0;
      }
      else
      {
         return 11 - resto;
      }
   }

   /**
    * Valida CPF.
    *
    * @return CPF validado.
    */
   private boolean validaCPF()
   {
      if (cpf.contains("."))
      {
         return cpf.substring(12).equals(digitosVerificadores);
      }
      else
      {
         return cpf.substring(9).equals(digitosVerificadores);
      }
   }
}

Exemplificando o seu funcionamento, segue uma classe com o método main:

package validacao;

/**
 * Classe para exemplificar e testar a classe : CPFUtil.
 *
 * @author $efcjunior$
 * @version $Revision: 1.1 $
  */
public class MainCPF
{
   /**
    * Método main.
    *
    * @param  args 
    */
   public static void main(String[] args)
   {
//		Formatos para Validação do CPF:
//		1) 111.111.111-11 ou
//		2) 111111111-11
      System.out.println(new CPFUtil("111.111.111-11").isValido());
      System.out.println(new CPFUtil("11111111111").isValido());

//		Formatos para Obtenção dos dígitos verificadores: 
//		1) 111.111.111 ou
//		2) 111111111
      System.out.println(new CPFUtil("111.111.111").getDigitosVerificadores());
      System.out.println(new CPFUtil("111111111").getDigitosVerificadores());
   }
}

Um abração a todos. :slight_smile:

Muito legal…parabens pela inicitiva …

Gostei do getDigitosVerificadores().

Pode-se invertar qq numero…eh muito para ser utilizados em testes … !

abracao

Não fiz nenhum tratamento de exceção, considerei que os formatos serão validados na entrada de dados.

Tem o Caelum Stella se quiserem usar ou dar uma estudada.

Sempre uso o código a Seguir para validar os CPFs nos meus sistemas, partindo do princípio que que existe um Atributo String Cpf ele retorna um boolean para a camada que o solicita

  [code] private String cpf;

public boolean validaCpf(){
	int cpf[] = new int[11], dv1=0, dv2=0;

	this.cpf = this.cpf.replace(".", "");
	this.cpf = this.cpf.replace("-", "");

	if (this.cpf.length()!=11)
		return false;

	for(int i=0;i<11;i++)
		cpf[i] = Integer.parseInt(this.cpf.substring(i, i+1));
	for(int i=0;i<9;i++)
           dv1 += cpf[i] * (i+1);
    cpf[9] = dv1 = dv1 % 11;
    for(int i=0;i<10;i++)
           dv2 += cpf[i] * i;
    cpf[10] = dv2 = dv2 % 11;
    if(dv1>9) cpf[9]=0;		if(dv2>9) cpf[10]=0;
    	      
    if(Integer.parseInt(this.cpf.substring(9,10))!= cpf[9]||
    		Integer.parseInt(this.cpf.substring(10,11))!=cpf[10])
    	return false;
    else
    	return true;
}[/code]