Escrito em August 19th, 2009 as 3:55 pm por

5 Comentários

Estava trabalhando em um projeto quando achei um algoritmo de validação de CPF desses que o pessoal pega em qualquer site fundo de quintal na net e claro que não funcionava direito!

Cansado disso hoje eu fiz o meu e ainda por cima deixei algumas horas rodando testes unitários em cima.

Ele valida até números de CPF que os algoritmos padrões não validam (os famosos “000.000.000-00″ até o “999.999.999-99″). Ele também valida números com ou sem a máscara (. e -).

Bom, ai vai ele em C# e VB.NET.

Esse funciona 100%

C#

/// <summary>
/// Algoritimo de Validação de CPF
/// </summary>
/// <param name="sourceCPF">CPF de Origem</param>
/// <returns></returns>
public bool ValidaCPF(string sourceCPF)
{
    // Pré-Verificação do Tamanho da String (Apenas para Performance)
    if (sourceCPF.Length != 14)
    {
        return false;
    }
    // Cria Objetos
    string clearCPF;
    int[] cpfArray;
    int totalDigitoI = 0;
    int totalDigitoII = 0;
    int modI;
    int modII;
    // Limpa o CPF
    clearCPF = sourceCPF.Trim(); // Elimina Espaços em Branco
    clearCPF = clearCPF.Replace("-", ""); // Remove Separador de Dígito Verificador
    clearCPF = clearCPF.Replace(".", ""); // Remove os Separadores das Casas
    // Verifica o Tamanho do Texto de Input
    if (clearCPF.Length != 11)
    {
        return false;
    }
    // Verifica os Patterns mais Comuns para CPF's Inválidos
    if (clearCPF.Equals("00000000000") ||
        clearCPF.Equals("11111111111") ||
        clearCPF.Equals("22222222222") ||
        clearCPF.Equals("33333333333") ||
        clearCPF.Equals("44444444444") ||
        clearCPF.Equals("55555555555") ||
        clearCPF.Equals("66666666666") ||
        clearCPF.Equals("77777777777") ||
        clearCPF.Equals("88888888888") ||
        clearCPF.Equals("99999999999"))
    {
        return false;
    }
    // Verifica se no Array Existe Apenas Números
    foreach (char c in clearCPF)
    {
        if (! char.IsNumber(c))
        {
            return false;
        }
    }
    // Converte o CPF em Array Numérico para Validar
    cpfArray = new int[11];
    for (int i = 0; i < clearCPF.Length; i++)
    {
        cpfArray[i] = int.Parse(clearCPF[i].ToString());
    }
    // Computa os Totais para os 2 Dígitos Verificadores
    for (int position = 0; position < cpfArray.Length - 2; position++)
    {
        totalDigitoI += cpfArray[position] * (10 - position);
        totalDigitoII += cpfArray[position] * (11 - position);
    }
    // Aplica Regras do Dígito 1
    modI = totalDigitoI % 11;
    if (modI < 2) { modI = 0; }
    else { modI = 11 - modI; }
    // Verifica o Digito 1
    if (cpfArray[9] != modI)
    {
        return false;
    }
    // Aplica o Peso para o Digito Verificador 2
    totalDigitoII += modI * 2;
    // Aplica Regras do Dígito Verificador 2
    modII = totalDigitoII % 11;
    if (modII < 2) { modII = 0; }
    else { modII = 11 - modII; }
    // Verifica o Digito 2
    if (cpfArray[10] != modII)
    {
        return false;
    }
    // CPF Válido!
    return true;
}

VB.NET

''' <summary>
''' Algoritimo de Validação de CPF
''' </summary>
''' <param name="sourceCPF">CPF de Origem</param>
''' <returns></returns>
Function ValidaCPF(ByVal sourceCPF As String) As Boolean
    ' Pré-Verificação do Tamanho da String (Apenas para Performance)
    If sourceCPF.Length <> 14 Then
        Return False
    End If
    ' Cria Objetos
    Dim clearCPF As String
    Dim cpfArray() As Integer
    Dim totalDigitoI As Integer = 0
    Dim totalDigitoII As Integer = 0
    Dim modI As Integer
    Dim modII As Integer
    ' Limpa o CPF
    clearCPF = sourceCPF.Trim() ' Elimina Espaços em Branco
    clearCPF = clearCPF.Replace("-", "") ' Remove Separador de Dígito Verificador
    clearCPF = clearCPF.Replace(".", "") ' Remove os Separadores das Casas
    ' Verifica o Tamanho do Texto de Input
    If clearCPF.Length <> 11 Then
        Return False
    End If
    ' Verifica os Patterns mais Comuns para CPF's Inválidos
    If (clearCPF.Equals("00000000000") Or _
        clearCPF.Equals("11111111111") Or _
        clearCPF.Equals("22222222222") Or _
        clearCPF.Equals("33333333333") Or _
        clearCPF.Equals("44444444444") Or _
        clearCPF.Equals("55555555555") Or _
        clearCPF.Equals("66666666666") Or _
        clearCPF.Equals("77777777777") Or _
        clearCPF.Equals("88888888888") Or _
        clearCPF.Equals("99999999999")) Then
        Return False
    End If
    ' Verifica se no Array Existe Apenas Números
    Dim c As Char
    For Each c In clearCPF
        If (Not Char.IsNumber(c)) Then
            Return False
        End If
    Next
    'Converte o CPF em Array Numérico para Validar
    ReDim cpfArray(10)
    For i As Integer = 0 To clearCPF.Length - 1
        cpfArray(i) = Integer.Parse(clearCPF(i).ToString())
    Next
    ' Computa os Totais para os 2 Dígitos Verificadores
    For position As Integer = 0 To cpfArray.Length - 3
        totalDigitoI += cpfArray(position) * (10 - position)
        totalDigitoII += cpfArray(position) * (11 - position)
    Next
    ' Aplica Regras do Dígito 1
    modI = totalDigitoI Mod 11
    If (modI < 2) Then
        modI = 0
    Else
        modI = 11 - modI
    End If
    ' Verifica o Digito 1
    If (cpfArray(9) <> modI) Then
        Return False
    End If
    ' Aplica o Peso para o Digito Verificador 2
    totalDigitoII += modI * 2
    ' Aplica Regras do Dígito Verificador 2
    modII = totalDigitoII Mod 11
    If (modII < 2) Then
        modII = 0
    Else
        modII = 11 - modII
    End If
    ' Verifica o Digito 2
    If (cpfArray(10) <> modII) Then
        Return False
    End If
    ' CPF Válido!
    Return True
End Function
Se você gostou do post, deixe um comentário ou assine nosso RSS RSS.

Posts Relacionados:

  1. Compressão de (Compactar) Dados
  2. Convertendo Caminhos Absolutos e URL’s Absolutas para Caminhos Relativos e URL’s Relativas
  3. Calculando CRC de Strings (Texto), Array’s e Arquivos
  4. Verificando se um tipo de objeto aceita valores nulos
  5. Configurando Data para Transmitir para WebServices
  6. Abrindo Arquivos de Texto e Lendo Todo o Conteúdo
  7. Ordenação de Listas (Coleções)
, , ,

5 Respostas to “Algoritmo para Validação de CPF”


  1. Renata Lourena

    2 years ago

    Muito Obrigado!
    Esse código realmente funciona! E me foi MUITO útil!

    Continue a postar códigos assim;)


  2. Guilherme Bacellar

    2 years ago

    Obrigada pelo Feedback Renata.


  3. Daniel Raphael

    1 year ago

    Olá até que enfim uma pessoa para nos ajudar já que funciona Guilherme
    será que funciona no Access uso XP a pergunta pode ser tola mas é que não entendo nada de programação sou novo na área.

    se alguém puder me ajudar ?
    meu email ddraphasilva@hotmail.com

    Atenciosamente

    Daniel Raphael


  4. Guilherme Bacellar

    1 year ago

    Olá Daniel,
    esse algoritmo funciona em C# (.NET) e não no Access.
    A formula na realidade é a mesma, o que você teria de fazer é programar uma macro ou função VBA no Access para funcionar.

    ;)


  5. Daniel

    2 months ago

    Muito obrigado pelo código.

    Vale lembrar que o cpf “012345678-9″ também deve ser validado nas críticas.

    Abraço!

Deixa uma Resposta

znjdb32s6g