HB++: Validação de Número de CPF

Gostou deste artigo? Compartilhe!

CategoriasPalm OS, Handheld Basic
ComentáriosComentários (15)

HB++: Validação de Número de CPF

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:

Cálculo do primeiro dígito verificador

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:

Cálculo do segundo dígito verificador

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 ProieteCaio Proiete é Arquiteto de Soluções, especialista em desenvolvimento de softwares para smartphones, principalmente nas plataformas Windows Phone 7, Windows Mobile, Palm OS, e Symbian OS.

Atualmente suas principais ferramentas/tecnologias de trabalho incluem Visual Studio 2010, Silverlight, eMbedded Visual C++, .NET Compact Framework, C# .NET, Objective-C, CodeWarrior C++, Handheld Basic, 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;
  • MCPD - Microsoft Certified Professional Developer for Windows Phone 7;
  • MCTS - Microsoft Certified Technology Specialist for Windows Mobile;
  • MCSD - Microsoft Certified Solution Developer;
  • MCDBA - Microsoft Certified Database Administrator;
  • MCAD .NET - Microsoft Certified Application Developer;
  • MCSD .NET - Microsoft Certified Solution Developer for .NET.

Blog técnico: http://caioproiete.net

Veja o todos os artigos publicados por Caio Proiete no PDAExpert.

Artigos Relacionados

  • Não existem artigos relacionados

15 Comentários »

Comentários via RSS TrackBack URI

  1. marcos andre em 15/02/2008 11:34

    agora eu entendo, obrigado por fazer eu entender

  2. 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

  3. 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 Catarina

    Assim, 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

  4. 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??

  5. Everton em 10/04/2008 17:44

    No meu CPF a soma é 55

  6. Mike em 15/04/2008 01:28

    o meu 43

  7. ednaldo elois da silva em 14/07/2008 17:49

    saber o numero do cpf

  8. Wilson Moreira Publio em 06/10/2008 03:02

    Como faria para colocar esse algoritmo em C#

  9. Elida Gerlana Barros em 23/10/2008 00:04

    Olhe eu gostei!!!Se for legal e não me trouxer problemas eu quero sim!!!!

  10. Renato em 30/10/2008 06:48

    Prezado amigo, sou desenvolvedor de aplicações Windows com VB. Possuo um palm Zire 72 e gostaria de programar utilizando meus conhecimentos. Solicitaria sua opinião de como fazer. Desde já muito grato. Renato.

  11. edson em 18/11/2008 22:03

    estive por acaso somando o meu cpf e a soma do primneiro digito nao beteu com a sua tese , o resto da divisao deu igual a dois , sendo assim seria entao 11 - 2 pra dar o resultado do primeiro digito , mas nao deu nao , porque?

  12. Marcia em 08/01/2009 12:47

    Gostaria de saber se tem como acahr o digito verificador do RG????
    Tem algum site ou fórmula p isso???

    Grata,

  13. GEOVANY em 07/03/2009 10:42

    Eu sou formando em matemática e quero fazer minha monografia em algebra modular, esse assundo do CPF cai muito bem, tbm outros codigos como RG, codigo de barras , etc.

    Tem alguma ideia pra me oferecer?
    Uma linha de raciocinio pra seguir, sabe, to meio perdidão.
    Valeu, gostei da ma téria.

  14. Gisele em 15/08/2009 00:08

    todos os cpf tem que ter 11 dígitos?

  15. edson ferreira da silva em 11/11/2009 14:32

    eu edson ferreira da silva vemho por meio desta pedir numero fa ze aparece cpf e desfase imtima posto de saude do paeiro smhor otavio algusto made lipar meu nome do spc e serasa e que aparesa cpf meiha

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.

Nome

E-mail

URL

Comentário

XHTML: São permitidas as seguintes tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

campos obrigatórios