Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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);