Validador de CPF

Boa noite, galera!

Estou com um problema: na hora de validar o cpf ele sempre aparece como inválido, mesmo com a opção correta, já verifiquei nos topicos da galera que tiveram o mesmo erro e que a solução era a troca do operador maior/menor, e não é o meu caso :confused:

Se puderem me ajudar, o código é esse:

console.log("Javascript carregado")

function validaCPF(cpf) {
    console.log(cpf.length)
    if(cpf.length != 11) {
        return false;

    } else {
    var numeros = cpf.substring(0, 9);
    var digitos = cpf.substring(9)
    
    var soma = 0;
    for (var i = 10; i > 1; i--) {
        soma += numeros.charAt(10 - i) * i;
    }
    // console.log(soma);

    var resultado = soma % 11 < 2 ? 0 : 11 - (soma % 11);

     //validação primeiro digito
    if (resultado != digitos.charAt(0)) {
        return  false;
    }
        soma = 0;
        numeros = cpf.substring(0, 10);

        for (var k = 11; k > 1; k--){
            soma += numeros.charAt(11 - k) * k;
        }

        resultado = soma % 11 < 2? 0 : 11 - (soma % 11); 

    //validacao do segundo digito
    if(resultado != digitos.charAt(1)) {
            return false;
        }

        return true;
    }
     
    }

    
function validacao() {
    console.log("iniciando validação CPF");
    document.getElementById('success').style.display = 'none';
    document.getElementById('error').style.display = 'none';

    var cpf = document.getElementById('cpf_digitado').value;

    var resultadoValidacao = validaCPF(cpf);

    if(resultadoValidacao) {
        document.getElementById('success').style.display = 'block';
    } else {
        document.getElementById('error').style.display = 'block';
    }
}

4 Likes

Troca o > por < na segunda atribuição do resultado.

2 Likes

alterei e não funcionou, continua na mesma

Captura de tela de 2022-05-20 21-24-08

1 Like

Essa linha:

resultado = soma % 11 > 2? 0 : 11 - (soma % 11);

Compara com essa linha:

var resultado = soma % 11 < 2 ? 0 : 11 - (soma % 11);

Você percebe que usou maior (>) quando era pra usar menor (<).

Logo:
resultado = soma % 11 < 2? 0 : 11 - (soma % 11);

Resolve.

3 Likes

Então, mesmo fazendo essa alteração não funcionou…

oii

Eu testei seu código aqui com a alteração que eu sugeri, rodou perfeitamente. Talvez seja algo no seu arquivo HTML.

1 Like

Jura? Teria como me dar um help dando uma olhada no meu HTML?

<!DOCTYPE html>

<head>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title>JavaScript Gama Academy</title>

    <!-- Latest compiled and minified CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"
        integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

    <!-- Optional theme -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css"
        integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">

    <link rel="stylesheet" href="./style.css">


</head>

<body>
    <div class="jumbotron">
        <div class="container">
            <h1 class="page-header">Validador de CPF</h1>
            <p>Através deste simples algoritmo, veremos diversos recursos e habilidades da linguagem Javascript</p>
        </div>

    </div>
    <div class="container formulario">
        <form>
            <div class="form-group">
                <div class="input-group input-group-lg">
                    <span class="input-group-addon" id="sizing-addon1">CPF</span>
                    <input type="text" class="form-control" placeholder="Digite o cpf para validação ..."
                        aria-describedby="sizing-addon1" id="cpf_digitado">
                </div>
                <small class="form-text text-muted">Digite somente numeros</small>
            </div>
            <button type="button" class="btn btn-info" onclick="validacao()">Validar !</button>
        </form>
    </div>
    <div class="container page-header">
        <div id="success" class="alert alert-success" style="display: none;" role="alert">
            <strong>Oba!</strong> Seu CPF é válido!
        </div>
        <div id="error" class="alert alert-danger" style="display: none;" role="alert">
            <strong>Ops!</strong> Seu CPF não é válido
        </div>
    </div>

</body>

<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

<!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" crossorigin="anonymous"
    integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"></script>
<script src="./script.js"></script>


</html>
1 Like

É, não sei mais dizer qual o problema. O HTML e JS do seu projeto eu copiei e testei aqui e funcionou :sweat_smile:

1 Like

às vezes pode ser que não funcione por você não ter dado o espaço entre 2 e ?.. dá o espaço e testa.

1 Like

Então, vamos ao básico.
Copiando e rodando aqui como mencionado pelo @willy rodou normalmente.

Definindo normalmente como:

  • O CPF informado não deve conter caracteres especiais nem espaços. Ex.: 12312312312 é um formato de CPF válido e 123.123.123-12 não é um formato de CPF válido.
  • O CPF precisa ser válido para que seja válido. Segundo a lógica, o CPF 11111111111 é um CPF válido pois o algoritmo não prevê CPFs compostos por um único dígito repetido e portanto trata como válido, algo que tem que ser melhorado, rejeitando CPFs compostos apenas por dígitos repetidos.
  • Se o CPF for inválido, ele será inválido.

Teste a aplicação fornecendo seu CPF sem caracteres especiais e verifique que é válido. Teste com o CPF 22222222222 que deve ser válido também. Teste com 12312312312 e deve ser inválido.

Atenção, recarregue a página no nevagador utilizando o comando Ctrl + F5 para evitar que ele carregue algo do cache e não atualize o seu código depois de realizar alterações.

Suerte!

2 Likes

O parse, análise sintática e/ou semântica não funciona dessa forma. No caso de um ternário ele ignora os espaços e considera como membros da expressão lógicas todos os elementos sintáticos antes do símbolo “?”

soma % 11 < 2 ? 0 : 11 - (soma % 11);
“expr1” ? “expr2” : “expr3” ;

expr1 = soma % 11 < 2
expr2 = 0
expr3 = 11 - (soma % 11)

Sobre isso: https://medium.com/reactbrasil/como-o-javascript-funciona-análise-resumo-das-árvores-de-sintaxe-asts-5-dicas-sobre-como-681eeb480b9e
Ainda mais: https://www.ic.unicamp.br/~sandro/cursos/mc910/slides/cap3-parser.pdf

Suerte!

1 Like

Desculpa se estarei fazendo algo óbvio que você já fez, mas já tentou reiniciar o cachê?
Pq aparentemente teu código tá funcionando.

2 Likes

Você já subiu o código no github?

Então, ele não vai e eu ainda não consegui achar o porquê e sim, já reiniciei a pagina, já limpei cache e todo o resto

Pior que já! :frowning_face:
não consigo entender o erro

Ainda não, tenho subido quando cosigo finalizar

Pois, esse CPF não é valido mesmo. Poste uma foto com um CPF válido, por exemplo, 77878208883.

Esse site gera CPFs válidos: Gerador de CPF - 4Devs

3 Likes

Ué, mas não bastavam ter 11 digitos para ser um cpf válido???
Realmente funcionou com o número que você passou. Não acredito que a solução era essa :woman_facepalming: realmente nunca iria funcionar.

1 Like

Por isso eu fiz uma postagem sobre o que é válido aqui: Validador de CPF - #12 by gomesgeorgelucas

Um CPF válido é válido segundo as regras do governo federal. Não basta ter 11 dígitos, mas tem que seguir a lógica de validação de um algoritmo.

Porém, como eu tinha dito. O seu algoritmo não está finalizado, pois ele aceita CPFs compostos de um único dígito, como 1111111111 ou 2222222222 como válidos (Faça um teste). Deve haver um bloco IF por exemplo rejeitando esses casos, pois CPFs com todos os dígitos repetidos são inválidos.

Suerte!

Sobre esse post de Github: Validador de CPF - #18 by SophiaFreitas

Um dos objetivos do github é compartilhar, não precisa estar certo, apenas estar disponível, assim você pode obter ajuda mais rápido e ainda colaboradores.

Suerte!

1 Like