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.

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:
- isCPF - retorna um valor booleano que indica se o número de CPF é válido ou inválido;
- iimprimeCPF - retorna o CPF formatado na máscara: 999.999.999-99.
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.
// 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:
-
CPF 444.444.444-44 é inválido: -
CPF é um número formado por 11 dígitos -
Existem caracteres alfabéticos no CPF -
CPF informado está correto (ou válido)