Validando o CPF em uma Aplicação Delphi

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

Este artigo apresenta como é realizada a validação de um número de Cadastro de Pessoa Física (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 a função isCPF, implementada na biblioteca de códigos "ValidaCPF" apresentada 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:

Cada um dos nove primeiros números do CPF é multiplicado por um peso que começa de 10 e que vai sendo diminuido de 1 a cada passo, somando-se as parcelas calculadas:

sm = (5*10)+(4*9)+(6*8)+(4*7)+(7*6)+(1*5)+(4*4)+(2*3)+(9*2) = 249;

Calcula-se o dígito através da seguinte expressão:

11 - (sm % 11) = 11 - (249 % 11) = 11 - 7 = 4

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

Cada um dos dez primeiros números do CPF, considerando-se aqui o primeiro DV, é multiplicado por um peso que começa de 11 e que vai sendo diminuido de 1 a cada passo, somando-se as parcelas calculadas:

sm = (5*11)+(4*10)+(6*9)+(4*8)+(7*7)+(1*6)+(4*5)+(2*4)+(9*3)+(4*2) = 299

Calcula-se o dígito através da seguinte expressão:

11 - (sm % 11) = 11 - (299 % 11) = 11 - 2 = 9

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 Delphi

Criar uma nova aplicação no ambiente de desenvolvimento Delphi 7 através da opção do menu "File|New|Application..." e realizar os três passos descritos a seguir:

1º Passo:

Desenvolver o formulário principal da aplicação como sugere a Figura 1. Atenção: observe que as caixas de textos explicativos utilizadas na figura apresentam a ordem sequencial e o nome do componente, a página da sua localização e as propriedades que devem ser alteradas com os respectivos valores.

Figura 1. Formulário principal da aplicação.

2º Passo:

Na unidade de códigos (unit), apresentada na Listagem 1, construída através da opção do menu "File|New|Unit" deve-se implementar os subprogramas:

  1. isCPF - retorna um valor booleano que indica se o número de CPF é válido ou inválido;
  2. iimprimeCPF - retorna o CPF formatado na máscara: 999.999.999-99.
Listagem 1. Unit "ValidaCPF" com as funções "isCPF" e "imprimeCPF".
unit ValidaCPF; interface function isCPF(CPF: string): boolean; function imprimeCPF(CPF: string): string; implementation uses SysUtils; // necessário para utilizar a função "StrToInt" function isCPF(CPF: string): boolean; var dig10, dig11: string; s, i, r, peso: integer; begin // length - retorna o tamanho da string (CPF é um número formado por 11 dígitos) if ((CPF = '00000000000') or (CPF = '11111111111') or (CPF = '22222222222') or (CPF = '33333333333') or (CPF = '44444444444') or (CPF = '55555555555') or (CPF = '66666666666') or (CPF = '77777777777') or (CPF = '88888888888') or (CPF = '99999999999') or (length(CPF) <> 11)) then begin isCPF := false; exit; end; // try - protege o código para eventuais erros de conversão de tipo na função StrToInt try { *-- Cálculo do 1o. Digito Verificador --* } s := 0; peso := 10; for i := 1 to 9 do begin // StrToInt converte o i-ésimo caractere do CPF em um número s := s + (StrToInt(CPF[i]) * peso); peso := peso - 1; end; r := 11 - (s mod 11); if ((r = 10) or (r = 11)) then dig10 := '0' else str(r:1, dig10); // converte um número no respectivo caractere numérico { *-- Cálculo do 2o. Digito Verificador --* } s := 0; peso := 11; for i := 1 to 10 do begin s := s + (StrToInt(CPF[i]) * peso); peso := peso - 1; end; r := 11 - (s mod 11); if ((r = 10) or (r = 11)) then dig11 := '0' else str(r:1, dig11); { Verifica se os digitos calculados conferem com os digitos informados. } if ((dig10 = CPF[10]) and (dig11 = CPF[11])) then isCPF := true else isCPF := false; except isCPF := false end; end; function imprimeCPF(CPF: string): string; begin imprimeCPF := copy(CPF, 1, 3) + '.' + copy(CPF, 4, 3) + '.' + copy(CPF, 7, 3) + '-' + copy(CPF, 10, 2); end; end.

As unidades ou bibliotecas de códigos (unit's) representam no Delphi a forma de disponibilizar um conjunto de subprogramas (functions e/ou procedures) destinados a solucionar uma série de tarefas bastante corriqueiras, como por exemplo, a função para validar números de CPF. Na Listagem 2 pode-se observar a estrutura básica de uma unit.

Listagem 2. Estrutura básica de uma unit.
// Cabeçalho da unidade de códigos. // Atenção: O nome interno da unit deve ser o mesmo nome dado ao arquivo fonte unit NomeDaUnit; interface // Comunicação entre dois meios (dispositivos). Contêm o cabeçalho // dos procedimentos e funções declarados na unit, declaração // de objetos globais e o uso de outras unidades. implementation // Corpo dos procedimentos e funções anunciados na seção de // interface e declarações de objetos locais. end.

Outro aspecto destacável da programação foi a utilização da estrutura de controle de erros "try – except - end" que irá proteger o código para eventuais erros de conversão de tipo com a função "StrToInt".

3º Passo:

Agora novamente no formulário principal da aplicação deve-se:

3.1: fazer a referência a unit "ValidaCPF", implementada no passo 2, através da opção do menu "File|Use Unit..." . A conclusão deste passo resulta na seguinte linha de código:

uses ValidaCPF;

3.2: implementar o seguinte código no evento "onClick" do botão "Verificar CPF":

// usando as funções isCPF e imprimeCPF da unit "ValidaCPF" if isCPF(CPF.Text) then Result.Caption := imprimeCPF(CPF.Text) else Result.Caption := 'Erro: CPF inválido !!!';

Confira também

Ilustrando a execução da aplicação:

  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)
Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados