terça-feira, 5 de março de 2013

C# - Função para validar um CPF



















Olá amigos. Ontem postei um código para validação de e-mail, e entrando nessa onde vou postar aqui a validação de CPF. O processo é bem simples e semelhante ao anterior, vamos passar um CPF (seja com pontos ou hífen) e a função vai tratar e retornar se é válido (true) ou não (false).
//Valida CPF
        public static bool validarCPF(string CPF)
        {
            int[] mt1 = new int[9] { 10, 9, 8, 7, 6, 5, 4, 3, 2 };
            int[] mt2 = new int[10] { 11, 10, 9, 8, 7, 6, 5, 4, 3, 2 };
            string TempCPF;
            string Digito;
            int soma;
            int resto;

            CPF = CPF.Trim();
            CPF = CPF.Replace(".", "").Replace("-", "");

            if (CPF.Length != 11)
                return false;

            TempCPF = CPF.Substring(0, 9);
            soma = 0;
            for (int i = 0; i < 9; i++)
                soma += int.Parse(TempCPF[i].ToString()) * mt1[i];

            resto = soma % 11;
            if (resto < 2)
                resto = 0;
            else
                resto = 11 - resto;

            Digito = resto.ToString();
            TempCPF = TempCPF + Digito;
            soma = 0;

            for (int i = 0; i < 10; i++)
                soma += int.Parse(TempCPF[i].ToString()) * mt2[i];

            resto = soma % 11;
            if (resto < 2)
                resto = 0;
            else
                resto = 11 - resto;

            Digito = Digito + resto.ToString();

            return CPF.EndsWith(Digito);
        }

14 comentários:

  1. Com expressões regulares você consegue realizar essa validação de CPF de uma forma muito mais simples, com apenas três linhas de código, da seguinte forma:

    public bool ValideCPF(string cpf)
    {
    string padraoCPF = "^\d{3}\.\d{3}\.\d{3}\-\d{2}$";

    // System.Text.RegularExpressions.Regex
    Regex expressaoRegularDeCPF = new Regex(padraoCPF);

    return expressaoRegularDeCPF.IsMatch(cpf);
    }

    ResponderExcluir
    Respostas
    1. E os cálculos aonde ficam nessa função? Pelo que vi você só está validando o formato.

      Excluir
    2. Ulysses, realmente com expressão regular é possível tornar o código muito menor, porém, como nosso amigo acima disse, você só esta validando o formato, cadê a continuação do seu código para validar o cálculo pelo DV?

      Excluir
    3. Ulysses meu amigo não atrapalha não, o formato eu já resolvi preciso de código para validar agora ahuahauahuaau

      Excluir
    4. Toma essa ateus:

      private bool validarCPF(string cpf)
      {
      string digito = String.Empty;
      int k, j, soma;

      for (k = 0; k < 2; k++)
      {
      soma = 0;
      for (j = 0; j < 9 + k; j++) soma += int.Parse(cpf[j].ToString()) * (10 + k - j);
      digito += (soma % 11 == 0 || soma % 11 == 1) ? 0 : (11 - (soma % 11));
      }

      return (digito[0] == cpf[9] & digito[1] == cpf[10]);
      }

      Obs.: O cpf já viria sem máscara.

      Excluir
    5. Foi amador hein Ulysses!
      tsi tsi tsi

      Excluir
  2. Este comentário foi removido pelo autor.

    ResponderExcluir
  3. Bom dia, estou aprendendo programação, estou usado seu código para validação de CPF mais ele ele está passando sequências EX: 111.111.111.11, como posso acerto isso?

    obrigado.

    ResponderExcluir
    Respostas
    1. adicionar após o trim/replace.

      if (CPF.Distinct().Count() == 1)
      return false;

      Excluir
  4. Você poderia me dizer qual a finalidade das variaveis mt1 e mt2 ?

    ResponderExcluir
  5. Pessoal estou tendo o seguinte problema:
    Se deixar espaços em branco no maskadTextBox(no meu caso), na hora de validar o CPF o programa vai dar pau! Como eu posso resolver isto?
    Desde de já agradeço!

    ResponderExcluir
  6. Bom Dia Fabio! Meu nome é Valdineia e sou estudante de TI, estou tendo uma certa dúvida quanto a realizar validação de CPF, contendo nome, telefone e endereço, sendo que temos que usar vetor, e matriz, para que fique na horizontal. Também tenho que faze a validação do CNPJ. Após isso feito em outro tenho que usar o mesmo exercício usando o Pzim. Será que tem como me ajudar?

    ResponderExcluir
  7. Esse é meu email:valdineiafernandes32@gmail.com

    ResponderExcluir