none
Validar CPFCnpj via Javascript com MVC 5 RRS feed

  • Pergunta

  • Tenho essa função javascript para validar CPF/CNPJ no mesmo controle.

    function isCpf(cpf) {
        var soma;
        var resto;
        var i;
        var msg = "Cpf Inválido!";

        if ((cpf.length != 11) ||
        (cpf == "00000000000") || (cpf == "11111111111") ||
        (cpf == "22222222222") || (cpf == "33333333333") ||
        (cpf == "44444444444") || (cpf == "55555555555") ||
        (cpf == "66666666666") || (cpf == "77777777777") ||
        (cpf == "88888888888") || (cpf == "99999999999")) {
            return false;
        }

        soma = 0;

        for (i = 1; i <= 9; i++) {
            soma += Math.floor(cpf.charAt(i - 1)) * (11 - i);
        }

        resto = 11 - (soma - (Math.floor(soma / 11) * 11));

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

        if (resto != Math.floor(cpf.charAt(9))) {
            return false;
        }

        soma = 0;

        for (i = 1; i <= 10; i++) {
            soma += cpf.charAt(i - 1) * (12 - i);
        }

        resto = 11 - (soma - (Math.floor(soma / 11) * 11));

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

        if (resto != Math.floor(cpf.charAt(10))) {
            return false;
        }

        return true;
    }

    function isCnpj(s) {
        var i;
        var c = s.substr(0, 12);
        var dv = s.substr(12, 2);
        var d1 = 0;
        var msg = "Cpf Inválido!";

        for (i = 0; i < 12; i++) {
            d1 += c.charAt(11 - i) * (2 + (i % 8));
        }

        if (d1 == 0) return false;

        d1 = 11 - (d1 % 11);

        if (d1 > 9) d1 = 0;
        if (dv.charAt(0) != d1) {
            return false;
        }

        d1 *= 2;

        for (i = 0; i < 12; i++) {
            d1 += c.charAt(11 - i) * (2 + ((i + 1) % 8));
        }

        d1 = 11 - (d1 % 11);

        if (d1 > 9) d1 = 0;
        if (dv.charAt(1) != d1) {
            return false;
        }

        return true;
    }

    function isCpfCnpj(valor) {
        var retorno = false;
        var numero = valor;

        numero = unformatNumber(numero);
        if (numero.length > 11) {
            if (isCnpj(numero)) {
                retorno = true;
            }
        } else {
            if (isCpf(numero)) {
                retorno = true;
            }
        }


        return retorno;
    }

    No meu CSHTML eu tenho essa chamada, no onclick do botão:

    <div>
            <form id="formPesquisa" onsubmit="" method="post">
                <label>CNPJ:</label>
                <input type="text" id="txtCnpjPesquisa" name="txtCnpjPesquisa" onkeypress=" return SomenteNumero(event);"/>
                <button id="btnPesquisarCnpj" name="btnPesquisarCnpj" class="btn-pesquisa" onclick="isCpfCnpj(formPesquisa.txtCnpjPesquisa);">Pesquisar</button>
            </form>
        </div>

    Acontece, que se eu digito um cpf ou cnpj inválido, o form é enviado assim mesmo. Gostaria de dar uma mensagem de CPF ou CNPJ inválido e o focus voltasse para o controle TextBox e não apagasse o Digitado, para que o usuário conferisse o que errou. Como eu faço isso?

    terça-feira, 29 de abril de 2014 12:42

Respostas

  • Tem como atualizar o codigo? E viu o meu exemplo?

    Segue o exemplo de Validação

    E com a mask do jquery nem tem a necessidade dessa função com regex, pois a mascara ja não deixa o usuario digitar letras dentro do input, logo pode remover essa funcao.

    Att.

    Rodolfo Oliveira

    • Marcado como Resposta pnet terça-feira, 29 de abril de 2014 20:56
    terça-feira, 29 de abril de 2014 20:43

Todas as Respostas

  • Você pode fazer assim com jquery:

    $(document).ready(function() {   

    $("#btnPesquisarCnpj").click(function() {       

    if (isCpfCnpj(formPesquisa.txtCnpjPesquisa)) {           

    return true;       

    }

    else {           

    alert('CPF ou CNPJ inválido');           

    $("#txtCnpjPesquisa").focus();           

    return false;       

    }   

    });

    });



    Elvis Rodrigues
    Analista Desenvolvedor .Net
    MCTS .Net Framework, SQL Server 2005, WPF, ASP NET
    Email foxelv@hotmail.com

    terça-feira, 29 de abril de 2014 14:29
  • Elvis, realmente é isso mesmo. Agora, você tem algum código que valide o CNPJ/CPF com máscara ou uma forma de nessa função retirar a máscara que está no campo para validar?

    Uso assim a máscara: $("#txtCnpjPesquisa").mask("99.999.999/9999-99");

    Como eu retiro e valido o campo?

    terça-feira, 29 de abril de 2014 16:39
  • Olá pnet, existem duas formas de remover a mascara do inputmasked uma é usar a função "unmask", por exemplo:

    $('#txtCnpjPesquisa').unmask();

    Ou remover os "." e "-" com o replace do javascript, ficando assim:

    CPF:

    cpf= cpf.replace('.', '');
    cpf= cpf.replace('.', '');
    cpf= cpf.replace('-', '');

    CNPJ:

    cnpj= cnpj.replace('.', '');
    cnpj= cnpj.replace('.', '');
    cnpj= cnpj.replace('/', '');
    cnpj= cnpj.replace('-', '');

    Espero ter ajudado, qualquer coisa só chamar =)

    Att.

    Rodolfo Oliveira


    • Editado Rodolfo Ferreira Oliveira terça-feira, 29 de abril de 2014 18:23 Desculpe, errei o replace do CNPJ, segue o correto
    terça-feira, 29 de abril de 2014 17:19
  • Tá dando sempre cnpj inválido, mesmo para CNPJ válido.
    terça-feira, 29 de abril de 2014 18:14
  • Me desculpe eu errei o replace do cnpj, mas ja atualizei o post com o replace correto.

    Você está fazendo pelo unmask ou replace?

    Att.

    Rodolfo Oliveira

    terça-feira, 29 de abril de 2014 18:24
  • Estou usando replace, mas isso aqui não funciona:

    formPesquisa.txtCnpjPesquisa

    Não existe valor. Tente assim: $('#formPesquisa.txtCnpjPesquisa').val() também não resolveu. Tirei o val() e também continua não funcionando. Como eu pego o valor do textbox no jquery ou javascript?

    terça-feira, 29 de abril de 2014 19:49
  • executa vai na página pelo browser clica em cima do textbox com o botão direito do mouse, e clica em inspecionar elemento, então vc pega o ID dele e coloca na expressão jquery.

    Elvis Rodrigues
    Analista Desenvolvedor .Net
    MCTS .Net Framework, SQL Server 2005, WPF, ASP NET
    Email foxelv@hotmail.com

    terça-feira, 29 de abril de 2014 19:58
  • Resolvi. Era cache do browser. Bem, mas mesmo assim a função do CNPJ não funciona. Acho que ela está errada, sei lá. peguei na internet. 

    $("#txtCnpjPesquisa").val() assim tem valor.

    terça-feira, 29 de abril de 2014 20:13
  • Pnet olha aqui como eu fiz no fiddler, a função está certinha é alguma coisa na hora de validar.

    Segue o exemplo de Validação

    Att.

    Rodolfo Oliveira

    terça-feira, 29 de abril de 2014 20:22
  • Descobri o erro. Ele está cortando o número do CNPJ quando ele começa com zero(0). É a função:

    function unformatNumber(pNum) {
        return String(pNum).replace(/\D/g, "").replace(/^0+/, "");
    }

    A expressão regular está fazendo isso.
    terça-feira, 29 de abril de 2014 20:29
  • Cara, fiz uma gambi e gostaria de resolver do modo certo. Retirei o 0 na expressão e coloquei um "a", pois senão ela dava erro. Dessa forma não corta mais o zero, mas....................
    terça-feira, 29 de abril de 2014 20:32
  • Tem como atualizar o codigo? E viu o meu exemplo?

    Segue o exemplo de Validação

    E com a mask do jquery nem tem a necessidade dessa função com regex, pois a mascara ja não deixa o usuario digitar letras dentro do input, logo pode remover essa funcao.

    Att.

    Rodolfo Oliveira

    • Marcado como Resposta pnet terça-feira, 29 de abril de 2014 20:56
    terça-feira, 29 de abril de 2014 20:43
  • essa função ela remove os caracteres não numéricos da máscatra, tipo: '.','/','-'. Vou ver sua função.
    terça-feira, 29 de abril de 2014 20:48
  • Valeu, resolvido.
    terça-feira, 29 de abril de 2014 20:57