
Introdução
A validação de número de CPF é um recurso bastante trivial e presente atualmente em praticamente todas as aplicações que lidam com este tipo de informação em seus cadastros. Garantir que um número de CPF informado pelo usuário é válido, é bastante simples e requer apenas a implementação do algoritmo utilizado pelo Ministério da Fazenda, na linguagem de programação utilizada.
Conceito
Um número de CPF possui normalmente 11 digitos, e o que define se o CPF é válido são seus últimos dois dígitos, conhecidos como "dígitos verificadores" e que são obtidos (calculados) através do algoritmo explicado abaixo. Em outras palavras, a rotina demonstrada não garante que um determinado número de CPF exista e realmente pertença a uma pessoa, mas sim, garante que de acordo com as especificações do Ministério da Fazenda, os números estão em uma ordem, matematicamente, correta.
Dessa forma, para saber se um número de CPF, por exemplo, 222.333.444-05, é válido, precisamos isolar os primeiros nove dígitos do CPF (222.333.444), calcular os dígitos verificadores, e compará-los com aos dígitos verificadores informados originalmente. Se forem iguais, o CPF é considerado válido, caso contrário, o CPF é considerado inválido, novamente, de acordo com as regras do Ministério da Fazenda.
Funcionamento do Algoritmo de Validação do CPF
O algoritmo de validação do CPF resume-se em calcular o primeiro dígito verificador a partir dos 9 (nove) primeiros dígitos do CPF, e em seguida, calcular o segundo dígito verificador a partir dos 9 (nove) primeiros dígitos do CPF, mais o primeiro dígito, obtido no passo inicial.
Para simplificar o entendimento, vamos fazer a validação de um número de CPF de exemplo: 222.333.444-05.
O primeiro passo, é calcular o primeiro dígito verificador, e para isso, isolamos os primeiros 9 (nove) dígitos do CPF (222.333.444) e multiplicamos cada um dos números, da direita para a esquerda (de trás para frente), por números crescentes a partir do número 2 (dois), como no exemplo abaixo:

Em seguida, efetuamos a soma de todos estes valores encontrados: 20 + 18 + 16 + 21 + 18 + 15 + 16 + 12 + 8 = 144. Com este número em mãos, dividimos por 11 para obter o resto da divisão. Neste caso o resto da divisão de 144 por 11 é igual a 1.
Após obter o resto da divisão, precisamos apenas aplicar uma pequena regra para descobrir o primeiro dígito:
- Se o resto da divisão for menor que 2, então o dígito é igual a 0 (Zero).
- Já se o resto da divisão for maior ou igual a 2, então o dígito é igual a 11 (Onze) menos o resto da divisão (11 - resto).
Aplicada a regra acima, chegamos ao nosso primeiro dígito verificador: 0 (Zero) (o resto da divisão é menor que 2, portanto o dígito é igual a 0 (Zero).
Com o primeiro dígito verificador calcular, partimos para o cálculo do segundo dígito verificador, repetindo o processo acima, mas incluindo o primeiro dígito verificador que acabamos de encontrar. Dessa forma, novamente vamos multiplicar cada um dos números, da direita para a esquerda (de trás para frente), por números crescentes a partir do número 2 (dois), como no exemplo abaixo:

Novamente, efetuamos a soma de todos os valores encontrados: 20 + 18 + 24 + 21 + 18 + 20 + 16 + 12 + 0 = 171. Com este número em mãos, dividimos por 11 para obter o resto da divisão. Neste caso o resto da divisão de 171 por 11 é igual a 6.
Após obter o resto da divisão, precisamos aplicar a mesma regra que utilizamos para obter o primeiro dígito:
- Se o resto da divisão for menor que 2, então o dígito é igual a 0 (Zero).
- Já se o resto da divisão for maior ou igual a 2, então o dígito é igual a 11 (Onze) menos o resto da divisão (11 - resto).
Aplicada a regra acima, chegamos ao segundo dígito verificador: 5 (Cinco) (o resto da divisão é maior que 2, portanto o dígito é igual a 11 - 6 = 5.
Após estes passos, já sabemos que os dígitos verificadores para o CPF 222.333.444 são 05 (Zero e Cinco), por isso, para confirmar se o CPF informado pelo usuário é válido, basta comparar os dígitos verificadores calculados com os dígitos verificadores que o usuário informou. Se forem iguais, o CPF é válido, caso contrário, o CPF é considerado inválido.
Implementação do Algoritmo no HB++
Para este exemplo, o algoritmo foi implementado como uma função estática de uma classe chamada CPF, como segue abaixo:
Public Static Function Validar(ByRef strCpf As String) As Boolean
'Verifica o CPF contém apenas números
If Not IsNumeric(strCpf) Then
Err.Raise 1001, "O CPF deve ser composto apenas por números!"
End If
'Define quantos caracteres serão utilizados para o cálculo.
'(Desconsidera os dois dígitos verificadores informados pelo usuário)
Dim iTotalChars As Integer
iTotalChars = Len(strCpf) - 2
Dim iValor As Integer
iValor = 0
Dim i As Integer
'Cálculo do primeiro dígito verificador
'-------------------------------------
'Multiplica cada um dos números, da direita para a esquerda
'(de trás para frente), por números crescentes a partir do número 2 (dois).
For i = 2 To iTotalChars + 1
'Efetua a soma do resultado da multiplicação de cada numero
iValor = iValor + (CInt(Mid(strCpf, Len(strCpf) - i, 1)) * i)
Next
Dim iFator As Integer
'Obtém o resto da divisão por 11
iFator = iValor Mod 11
'Aplica a regra para descobrir o primeiro dígito
Dim iDigito1 As Integer
If (iFator < 2) Then
iDigito1 = 0
Else
iDigito1 = 11 - iFator
End If
'-------------------------------------
'Cálculo do segundo dígito verificador
'-------------------------------------
'Multiplica cada um dos números, da direita para a esquerda
'(de trás para frente), por números crescentes a partir do número 2 (dois),
'incluindo o primeiro dígito verificador encontrado no passo anterior
iValor = iDigito1 * 2
For i = 2 To iTotalChars + 1
'Efetua a soma do resultado da multiplicação de cada numero
iValor = iValor + (CInt(Mid(strCpf, Len(strCpf) - i, 1)) * (i + 1))
Next
'Obtém o resto da divisão por 11
iFator = iValor Mod 11
'Aplica a regra para descobrir o primeiro dígito
Dim iDigito2 As Integer
If (iFator < 2) Then
iDigito2 = 0
Else
iDigito2 = 11 - iFator
End If
'Verifica se os dígitos estão corretos, e retorna True ou False
If Right(strCpf, 2) = (CStr(iDigito1) & CStr(iDigito2)) Then
Validar = True
Else
Validar = False
End If
End Function
Com o algoritmo implementado, basta efetuar algumas validações e executar a função:
Private Sub btnValidarCPF_Click()
Try
'Obtém o CPF informado pelo usuário
Dim strCpf As String
strCpf = txtCpf.Text
'Retira os pontos, traços e espaços que
'o usuário pode ter informado (se existir)
strCpf = Replace(strCpf, ".", "")
strCpf = Replace(strCpf, "-", "")
strCpf = Replace(strCpf, " ", "")
If CPF.Validar(strCpf) = True Then
MsgBox "Número de CPF VÁLIDO!", hbMsgBoxInformation, "OK"
Else
MsgBox "Número de CPF INVÁLIDO!", hbMsgBoxError, "ERRO"
End If
Catch
'Ocorreu um Erro. Mostra a mensagem para o usuário
MsgBox Err.Description, hbMsgBoxError
End Catch
End Sub
Considerações
- 1-) Embora os números de CPF possuam normalmente 11 dígitos, a rotina demonstrada neste artigo está preparada para efetuar a validação de CPFs com mais de 11 dígitos.
- 2-) Alguns desenvolvedores optam por implementar rotinas que invalidam CPFs que possuam todos os números iguais. Por exemplo, o CPF 555.555.555-55 é, matematicamente, válido e por isso deve ser considerado como tal.
Histórico
- 18/08/2007 - Primeira versão deste artigo.
Sobre o Autor
Caio Proiete é Arquiteto de Soluções, especialista em desenvolvimento de softwares para PDAs e telefones celulares, principalmente nas plataformas Palm OS, Windows Mobile e Symbian OS.
Atualmente suas principais ferramentas/tecnologias de trabalho incluem CodeWarrior C++, Handheld Basic, eMbedded Visual C++, .NET Compact Framework, C# .NET, e Carbide.c++.
Possui extensa experiência em arquitetura e desenvolvimento de sistemas baseados em web e smart-clients, gerenciamento de projetos e treinamento, e atua também como instrutor oficial Microsoft em centros de treinamentos (CLPS), e é detentor das seguintes certificações:
- MCT - Microsoft Certified Trainer;
- MCSD - Microsoft Certified Solution Developer;
- MCDBA - Microsoft Certified Database Administrator;
- MCAD .NET - Microsoft Certified Application Developer;
- MCSD .NET - Microsoft Certified Solution Developer for .NET;
- MCTS - Microsoft Certified Technology Specialist for Windows Mobile.
Veja o todos os artigos publicados por Caio Proiete no PDAExpert.
Artigos Relacionados
- Não existem artigos relacionados
6 Comentários »
Comentários via RSS TrackBack URI
-
marcos andre em 15/02/2008 11:34
agora eu entendo, obrigado por fazer eu entender
-
Percy de Oliveira Junior em 18/03/2008 17:36
Caro Caio
Quando tirei meu CPF, acho que em 1969, me lembro que o atendente perguntou o que eu fazia e ao ouvir que era estudante, olhou numa lista e colocou o número 63. É isso mesmo ou estou louqueando com o tempo.
Agora parece que o tal número só serve p/ confirmar..
Se puder me esclarecer, agradeço
percy -
Caio Proiete em 18/03/2008 18:01
Caro Percy,
Até onde sei, nenhum dos dígitos do CPF reflete a profissão. Imagino que esse “63″ que o atendente gravou seja apenas uma forma de classificação interna do sistema da Receita Federal.
Se não estou enganado, apenas o último dígito do CPF (sem contar os dígitos verificadores) tem algum significado… Os outros números são apenas a sequência numérica crescente.
O último dígito (novamente, excluindo os digitos verificadores), indica a origem do CPF, onde:
0 = Rio Grande do Sul
1 = Distrito Federal, Goiás, Mato Grosso, Mato Grosso do Sul e Tocantins
2 = Amazonas, Pará, Roraima, Amapá, Acre e Rondônia
3 = Ceará, Maranhão e Piauí
4 = Paraíba, Pernambuco, Alagoas e Rio Grande do Norte
5 = Bahia e Sergipe
6 = Minas Gerais
7 = Rio de Janeiro e Espírito Santo
8 = São Paulo
9 = Paraná e Santa CatarinaAssim, por exemplo, olhando para o CPF 303.714.628-19, podemos dizer que é válido (calculando vê-se que 19 é o dígito correto), e podemos dizer também que foi emitido em São Paulo (último dígito = 8).
Abraços,
Caio Proiete -
Stefi em 03/04/2008 12:02
Me disseram que a soma dos números do CPF sempre vai ser múltiplo de 4. Somei vários cpfs e todos deram 44.
Qual o motivo para isso?? -
Everton em 10/04/2008 17:44
No meu CPF a soma é 55
-
Mike em 15/04/2008 01:28
o meu 43


Envie seu comentário
ATENÇÃO: A área de comentários deve ser utilizada apenas para dúvidas sobre este artigo. Para dúvidas não relacionadas a este artigo, utilize o Fórum PDAExpert.net.