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)

Artigos relacionados