Validar CPF

Validar CPF
Tempo de leitura: 5 minutos

Validar CPF: Imagine que você está construindo um sistema para uma empresa e uma das tarefas é verificar a validade dos CPFs. Agora, você pode pensar que um CPF é válido se ele segue o formato “###.###.###-##”, onde cada ‘#’ é um número, certo? Mas, na verdade, há mais nisso!

Além de seguir esse formato, um CPF também precisa passar por uma verificação matemática para ser considerado válido. Então, da próxima vez que você precisar validar um CPF em seu sistema, lembre-se: não é apenas sobre o formato, mas também sobre a matemática por trás dele. E acredite, você vai se surpreender com o quão simples pode ser!

Ahhh, antes que eu me esqueça, use um número de CPF sem ponte e nem traço, apenas os números, seguindo o seguinte formato: 45499555036 – (CPF fictício, OK!);


See the Pen Valida CPF by Thiago Rossi (@thiagox86) on CodePen.


Regras para Validar um CPF

Pense no CPF como uma sequência de 11 números que seguem um padrão específico, algo como “###.###.###-##”, onde cada ‘#’ é um número. Agora, a parte interessante é como verificamos se um CPF é válido ou não.

Para fazer isso, pegamos os primeiros 9 números do CPF e fazemos um cálculo simples. Depois, verificamos se o resultado desse cálculo corresponde aos dois últimos números do CPF (aqueles depois do “-”).

Então, basicamente, a validação do CPF é como um pequeno jogo de quebra-cabeça onde usamos matemática para verificar se todas as peças se encaixam corretamente!

Validando o Primeiro Dígito

Primeiramente multiplica-se os 9 primeiros dígitos pela sequência decrescente de números de 10 à 2 e soma os resultados. Assim:

4 * 10 + 5 * 9 + 4 * 8 + 9 * 7 + 9 * 6 + 5 * 5 + 5 * 4 + 5 * 3 + 0 * 2

O resultado do nosso exemplo é:

294

O próximo passo da verificação também é simples, basta multiplicarmos esse resultado por 10 e dividirmos por 11.

294 * 10 / 11

O resultado que nos interessa na verdade é o RESTO da divisão. Se ele for igual ao primeiro dígito verificador (primeiro dígito depois do ‘-‘), a primeira parte da validação está correta.

Observação Importante: Se o resto da divisão for igual a 10, nós o consideramos como 0.

Vamos conferir o primeiro dígito verificador do nosso exemplo:

O resultado da divisão acima é ‘267’ e o RESTO é 3

Isso significa que o nosso CPF exemplo passou na validação do primeiro dígito.

Validando o Segundo Dígito

A validação do segundo dígito é semelhante à primeira, porém vamos considerar os 9 primeiros dígitos, mais o primeiro dígito verificador, e vamos multiplicar esses 10 números pela sequencia decrescente de 11 a 2. Vejamos: 45499555036

4 * 11 + 5 * 10 + 4 * 9 + 9 * 8 + 9 * 7 + 5 * 6 + 5 * 5 + 5 * 4 + 0 * 3 + 3 * 2

O resultado é:

346

Seguindo o mesmo processo da primeira verificação, multiplicamos por 10 e dividimos por 11.

346 * 10 / 11

Verificando o RESTO, como fizemos anteriormente, temos:

O resultado da divisão é ‘314’ e o RESTO é 6

Verificamos, se o resto corresponde ao segundo dígito verificador.

Com essa verificação, constatamos que o CPF 454.995.550-36 é válido.

CPFs Conhecidos que são Inválidos

Você sabia que alguns CPFs podem passar na validação que mencionamos, mas ainda assim não são válidos? Isso acontece quando todos os dígitos do CPF são iguais, como “111.111.111-11” ou “222.222.222-22”. Mesmo que esses números sigam o formato correto e passem na verificação matemática, eles não são considerados CPFs válidos.

Então, em nosso algoritmo, vamos adicionar uma etapa extra. Antes de tudo, vamos verificar se todos os dígitos do CPF são iguais. Se forem, vamos considerar esse CPF como inválido, mesmo que ele passe nas outras verificações.

Assim, garantimos que nosso algoritmo está verificando os CPFs corretamente!

Confira o código fonte da nossa solução

<style>
    #tr-div-cpf,
    #tr-div-cpf input {
        width: 100%;
        margin-bottom: 25px;
    }

    #tr-div-cpf input {
        height: 50px;
        font-size: 1.5em;
    }

    #tr-div-cpf button {
        font-family: Ubuntu;
        font-size: 1.3em;
    }
</style>

<div id="tr-div-cpf">
    <input  type="number" 
            id="tr-cpf" 
            placeholder="CPF SEM PONTO E SEM TRAÇO"
            onkeypress="return apenasNumeros(event)"
    >
    <button onclick="validaCPF()">VALIDA CPF</button>
</div>

<script>
    function apenasNumeros(e) {
        let tecla = (window.event) ? event.keyCode : e.which;
        if ((tecla > 47 && tecla < 58)) 
            return true;
        else
            return false;
    }

    function validaCPF() {
        let cpf = document.getElementById('tr-cpf').value;        
        if(cpf === '') {
            alert('Favor informe um CPF!');
            limpaInput();
        } else if (cpf.length < 11 || cpf.length > 11) {
            alert('Favor informe um CPF válido!');
            limpaInput();
        } else {            
            let strCPF = cpf.toString();
            let counter = 0;

            //VERIFICA SE OS 11 DÍGITOS SÃO IGUAIS COMO POR EXEMPLO EM 11111111111
            for(let i=0; i < strCPF.length - 1; i++) {
                if(strCPF[i] == strCPF[i+1]) {
                    strIgual = true;
                    counter++;
                } else {
                    strIgual = false;
                }                
            }

            //VERIFICA SE O CONTADOR É IGUAL 10: SE SIM, ENTÃO TODOS OS NÚMEROS SÃO IGUAIS, SENÃO VERIFICA SE O CPF É VÁLIDO SEGUNDO A FÓRMULA DE CÁLCULO DO DÍGITO VERIFICADOR
            if (counter == 10) {
                alert('CPF inválido');
                limpaInput();
            } else {
                let soma = 0;
                let resto;
                let primeiroDigito;
                let segundoDigito;

                //BLOCO DE VERIFICAÇÃO DO PRIMEIRO DÍGITO VERIFICADOR
                for(let i=1; i <= strCPF.length - 2; i++) {
                    soma = soma + parseInt(strCPF.substring(i-1, i)) * (11 - i);                    
                }
                resto = (soma * 10) % 11;
                
                if ((resto === 10) || (resto === 11)) {
                    resto = 0;
                }

                if (resto !== parseInt(cpf.substring(9, 10))) {
                    alert('PRIMEIRO Dígito verificador inválido!');
                } else {
                    primeiroDigito = true;
                }

                //BLOCO DE VERIFICAÇÃO DO SEGUNDO DÍGITO VERIFICADOR
                soma = 0;
                if(primeiroDigito) {
                    for (let i = 1; i <= strCPF.length - 1; i++) {
                        soma = soma + parseInt(strCPF.substring(i-1, i)) * (12 - i);
                    }
                    resto = (soma * 10) % 11;

                    if ((resto === 10) || (resto === 11)) { 
                        resto = 0;
                    }

                    if (resto !== parseInt(cpf.substring(10, 11))) {
                        alert('SEGUNDO Dígito verificador inválido!');
                    } else {
                        segundoDigito = true;
                    }
                }

                if( primeiroDigito && segundoDigito) {
                    alert('CPF VÁLIDO!!!!');                    
                }
            }
            
        }
    }

    function limpaInput() {
        document.getElementById('tr-cpf').value = '';
    }
</script>

Código Explicado

  1. Estilo CSS: O código CSS está definindo o estilo para um elemento de entrada e um botão dentro de um div com o id tr-div-cpf. Ele define a largura, a margem inferior, a altura e o tamanho da fonte desses elementos.
  2. HTML: O código HTML cria um campo de entrada numérico e um botão. O campo de entrada aceita apenas números e chama a função apenasNumeros(event) a cada pressionamento de tecla para garantir isso. O botão, quando clicado, chama a função validaCPF().
  3. JavaScript: Existem três funções JavaScript aqui:
    • apenasNumeros(e): Esta função é chamada a cada pressionamento de tecla no campo de entrada. Ela verifica se a tecla pressionada é um número e, se não for, impede a entrada.
    • validaCPF(): Esta função é chamada quando o botão é clicado. Ela primeiro verifica se o campo de entrada está vazio ou se o CPF inserido tem menos ou mais de 11 dígitos. Se qualquer uma dessas condições for verdadeira, ela exibe um alerta e limpa o campo de entrada. Se o CPF passar nessas verificações iniciais, a função então verifica se todos os dígitos do CPF são iguais. Se forem, ela considera o CPF inválido. Se não forem, ela realiza a validação matemática do CPF, verificando os dígitos verificadores.
    • limpaInput(): Esta função simplesmente limpa o campo de entrada, definindo seu valor como uma string vazia.

Conclusão

Neste artigo para validar CPF, abordamos que além de seguir um determinado formato, um CPF também precisa passar por uma verificação matemática para ser considerado válido.

E caso você seja iniciante no mundo do desenvolvimento, não deixe de acessar nossas trilhas de estudo, para que você comece do jeito sua carreira de desenvolvedor! Clique e conheça nossas trilhas de aprendizagem:

E para que você continue estudando e evoluindo nada melhor do que um computador com os melhores preços, marcas renomadas e confiança na entrega que só a Amazon oferece. Clique aqui é veja as melhores promoções das melhores marcas de notebooks e com a melhor entrega do mercado!!!

E para você que já adquiriu seu novo notebook para estudar, precisará validar seus códigos, e para isso você precisará de uma plataforma de host completa. Clique aqui e conheça a Hostinger, a hospedagem de sites com potência de verdade!!!