Validando o CPF em uma Aplicação Java

Veja neste artigo uma aplicação Java para validar números do Cadastro de Pessoa Física (CPF).

Este artigo apresenta como é realizada a validação de um número de CPF que é o documento de identificação do contribuinte pessoa física perante a Receita Federal.

O CPF é um número formado por 11 dígitos dos quais os dois últimos são chamados de dígitos verificadores (DV). Cada DV é calculado com base nos dígitos anteriores e juntos servem para validar o número do CPF como um todo. Assim, torna-se importante quando um número de CPF é digitado pelo usuário final em uma aplicação utilizar o método isCPF() , implementado no pacote "meuPacote" apresentado na Listagem 1, para verificar se o número informado está correto evitando, por exemplo, o cadastro de CPFs inválidos.

Para exemplificar o algoritmo de verificação do CPF será utilizado como exemplo o CPF número 546.471.429-49.

O cálculo dos DVs é executado em duas etapas usando para isto o módulo de divisão 11 (módulo de divisão é a parte inteira do resultado de uma divisão):

Para calcular o 1º dígito verificador

obs. Se o resto da divisão (operador %) calculado for 10 ou 11, o dígito verificador será 0; nos outros casos, o dígito verificador é o próprio resto.

Para calcular o 2º dígito verificador

obs. se o resto da divisão (operador %) calculado for 10 ou 11, o dígito verificador será 0; nos outros casos, o dígito verificador é o próprio resto.

Desenvolvendo a Aplicação Java

Criar um novo projeto no ambiente de desenvolvimento NetBeans através da opção do menu "Arquivo|Novo Projeto..." e realizar os dois passos descritos a seguir:

1º Passo

Criar um pacote Java e identificá-lo com o nome "meuPacote". No pacote criado implementar a classe Java ValidaCPF, mostrada na Listagem 1, com os métodos:

      isCPF() - retorna um valor booleano que indica se o número de CPF é válido ou inválido;
      imprimeCPF() - retorna o CPF formatado na máscara: 999.999.999-99.
package meuPacote; import java.util.InputMismatchException; public class ValidaCPF { public static boolean isCPF(String CPF) { // considera-se erro CPF"s formados por uma sequencia de numeros iguais if (CPF.equals("00000000000") || CPF.equals("11111111111") || CPF.equals("22222222222") || CPF.equals("33333333333") || CPF.equals("44444444444") || CPF.equals("55555555555") || CPF.equals("66666666666") || CPF.equals("77777777777") || CPF.equals("88888888888") || CPF.equals("99999999999") || (CPF.length() != 11)) return(false); char dig10, dig11; int sm, i, r, num, peso; // "try" - protege o codigo para eventuais erros de conversao de tipo (int) try { // Calculo do 1o. Digito Verificador sm = 0; peso = 10; for (i=0; i<9; i++) { // converte o i-esimo caractere do CPF em um numero: // por exemplo, transforma o caractere "0" no inteiro 0 // (48 eh a posicao de "0" na tabela ASCII) num = (int)(CPF.charAt(i) - 48); sm = sm + (num * peso); peso = peso - 1; } r = 11 - (sm % 11); if ((r == 10) || (r == 11)) dig10 = "0"; else dig10 = (char)(r + 48); // converte no respectivo caractere numerico // Calculo do 2o. Digito Verificador sm = 0; peso = 11; for(i=0; i<10; i++) { num = (int)(CPF.charAt(i) - 48); sm = sm + (num * peso); peso = peso - 1; } r = 11 - (sm % 11); if ((r == 10) || (r == 11)) dig11 = "0"; else dig11 = (char)(r + 48); // Verifica se os digitos calculados conferem com os digitos informados. if ((dig10 == CPF.charAt(9)) && (dig11 == CPF.charAt(10))) return(true); else return(false); } catch (InputMismatchException erro) { return(false); } } public static String imprimeCPF(String CPF) { return(CPF.substring(0, 3) + "." + CPF.substring(3, 6) + "." + CPF.substring(6, 9) + "-" + CPF.substring(9, 11)); } }

Na implementação de uma classe ou de um conjunto de classes em um pacote Java o código fonte deve ser iniciado com a diretiva package, seguida do nome do pacote (meuPacote). Um pacote ou package em Java nada mais é do que um conjunto de classes (framework). Usualmente, são colocadas em um package classes relacionadas, construídas com um propósito comum; assim, sob certos aspectos, os packages reproduzem a ideia das bibliotecas de código (libraries e unit"s) de outras linguagens de programação.

Outro aspecto destacável da programação foi a utilização da estrutura de controle de erros try – catch que irá proteger o código para eventuais erros de conversão de tipo feita pelo operador de coerção (int).

2º Passo

Implementar a classe principal Exemplo mostrada na Listagem 2.

import java.util.Scanner; // importanto a classe "ValidaCPF" do pacote "meuPacote" import meuPacote.ValidaCPF; public class Exemplo { public static void main(String[] args) { Scanner ler = new Scanner(System.in); String CPF; System.out.printf("Informe um CPF: "); CPF = ler.next(); System.out.printf("\nResultado: "); // usando os metodos isCPF() e imprimeCPF() da classe "ValidaCPF" if (ValidaCPF.isCPF(CPF) == true) System.out.printf("%s\n", ValidaCPF.imprimeCPF(CPF)); else System.out.printf("Erro, CPF invalido !!!\n"); } } }

Alguns aspectos da programação utilizada na classe ValidaCPF apresentada na Listagem 1 foram abordados no post:

O que são String em Java: Métodos da Classe String: String em Java.

Testando a execução da aplicação da Listagem 2:
1. CPF 444.444.444-44 é inválido:
2. CPF é um número formado por 11 dígitos:
3. Existem caracteres alfabéticos no CPF:
4. CPF informado está correto (ou válido):
Tabela 1. Testando a execução da aplicação da Listagem 2

Obrigado e um abraço.


Saiu na DevMedia!

  • Um bate papo sobre Android Nativo:
    Pesquisamos quais são as dúvidas inicias de quem está começando no Android e decidimos responder algumas delas neste DevCast.

Saiba mais sobre Java ;)

  • Cmo ser um Programador Java:
    Aprender Java não é uma tarefa simples, mas seguindo a ordem proposta nesse Guia, você evitará muitas confusões e perdas de tempo no seu aprendizado. Vem aprender java de verdade, vem!

Artigos relacionados