Solucionado (ver solução)
Solucionado
(ver solução)
10
respostas

CPF retorna sempre inválido

Olá!

meu CPF retorna sempre inválido e eu não sei o porquê.

private void btn_valida_Click(object sender, EventArgs e)
        {
            bool validaCpf = false;
            validaCpf = Valida(msk_cpf.Text);

            if (validaCpf == true)
            {

                lbl_resultado.Text = "CPF VÁLIDO";
                lbl_resultado.ForeColor = Color.DarkSeaGreen;
            }
            else
            {

                lbl_resultado.Text = "CPF INVÁLIDO";
                lbl_resultado.ForeColor = Color.IndianRed; 
            }
        }

alguém consegue notar algum erro?

obrigado

10 respostas

Poderia passar os codigos do metodo "Valida()"?

Olá, Ivo. Td bem? Meu código é o mesmo da aula. Eu apenas copiei e colei. Não fiz nenhuma alteração.

Inclusive, eu fiz o download do projeto da aula no módulo seguinte, e o erro continua igual.

Talvez o problema esteja no compilador do meu visual studio.. só não faço ideia do que pode estar causando esse problema.

public bool Valida(string cpf)
        {
            int[] multiplicador1 = new int[9] { 10, 9, 8, 7, 6, 5, 4, 3, 2 };
            int[] multiplicador2 = 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()) * multiplicador1[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()) * multiplicador2[i];
            resto = soma % 11;
            if (resto < 2)
                resto = 0;
            else
                resto = 11 - resto;
            digito = digito + resto.ToString();
            return cpf.EndsWith(digito);
        }

vlww

Descobri que a causa do problema é aquilo que já tinha perguntado em outro tópico: a instrução .Replace(".", "") não está eliminando o ponto da contagem de caracteres.

Dessa forma, para o programa, o meu CPF tem sempre 13 dígitos em vez de 11, já que ele contabiliza os 2 pontos que foram configurados na máscaratxtbox.

Já tentei várias soluções mas até agora não consigo resolver esse problema.

O que extamente voce esta colocando no "msk_cpf.Text"? Testei no meu e rodou certo. O " . " que voce esta usando e o que esta do lado da " . " ou que esta nos teclados numericos? dependendo isso pode dar diferenca.

Estou com o mesmo problema, sempre retorna inválido.

Não estou usando ponto pq o ponto já está na máscara. Eu apenas digito os números no campo do CPF.

O que está causando erro, como já mencionei, é que o método Replace não está substituindo o ponto da máscara por um caractere vazio. Dessa forma, o programa entende que digitei 13 caracteres ao invés de 11, uma vez que ele lê 11 números mais os 2 pontos. E quando eu digito apenas 9 números o botão de valida dá "crash".

Já usei várias versões disponibilizadas no mão na massa e o erro sempre persiste.

Meu VS estava no idioma inglês e achei que fosse essa configuração que estivesse causando conflito, mas eu mudei a língua e continua igual.

tá difícil.. -,-

solução!

Olá, Ley. Já tentou usar expressões regex ou ver a forma que esta passando esse parâmetro?

expressão regex, retorna somente números

    string.Join(null, System.Text.RegularExpressions.Regex.Split(seuTextoAqui, "[^\\d]")); 

você pode tentar com linq também

    string.Join("", cpf.ToCharArray().Where(Char.IsDigit))

Você também consegue diminuir a quantidade de linhas

private void btn_valida_Click(object sender, EventArgs e)
    {
        if (Valida(msk_cpf.Text))
        {
            lbl_resultado.Text = "CPF VÁLIDO";
            lbl_resultado.ForeColor = Color.DarkSeaGreen;
        }
        else
        {
            lbl_resultado.Text = "CPF INVÁLIDO";
            lbl_resultado.ForeColor = Color.IndianRed; 
        }
    }

Espero ter ajudado, qualquer coisa, dá um toque. Abraço

Eae, Carlos!

Obrigado pela ajuda!

Tanto o primeiro quanto o segundo código funcionaram. Entretanto, tive que inseri-los tanto no botão valida quanto na classe Cls_Uteis. Quando adicionava esse código apenas no no botão valida o erro desaparecia, porém o cpf retornava sempre inválido, e quando adicionava o código apenas na Cls_Uteis o programa continuava enxergando 13 caracteres em vez de 11.

Ainda não aprendi sobre expressões regex e linq, por isso não fazia ideia que tinha como resolver dessa forma.

Obrigado pela força, abrass

Ley, no meu caso o problema estava na definição da mascara no campo, você pode tentar refazer esse passo.

Que bom que deu certo.

Já tentou inicializar a variável temp logo no início?

substituir isso :

cpf = cpf.Trim();
    cpf = cpf.Replace(".", "").Replace("-", "");
    if (cpf.Length != 11)
        return false;
        tempCpf = cpf.Substring(0, 9);

por isso

tempCpf =string.Join(null, System.Text.RegularExpressions.Regex.Split(cpf, "[^\\d]"));;
    if (tempCpf .Length != 11)
        return false;
      tempCpf = tempCpf.Substring(0, 9);