Abril.com Notícias Entretenimento Homem INFO Downloads Reviews Busca Celular Assine Loja Grupo Abril
PORTAL AGENDA DE EVENTOS ARTICULISTAS MULTIMÍDIA FÓRUM CODE IMASTERS PRO
Javascript
Algoritmo do CNPJSegunda-feira, 16/08/2004 às 15h06, por Thiago Prado
Nesta semana vamos entender um pouco como funciona o algoritmo do CNPJ. A lógica
para saber se o CNPJ é verdadeiro, é necessário fazer um cálculo para validar os dígitos
verificadores, que são responsáveis por diferenciar um CNPJ de outro.
Como hoje em dia é muito comum as empresas utilizarem sistemas baseados em
linguagens de internet, a validação de dados se torna muito importante para que o sistema
não gere erros. Esse algoritmo que é responsável pela validação do CNPJ foi feito de
acordo com a regras do Ministério da Fazenda.
O código abaixo foi testado nos seguintes browsers:
Internet Explorer 4+
Netscape 4+
Opera 7
Mozilla 1.6
Conhecendo o cálculo do algoritmo do CNPJ
O número que compõe o CNPJ é composto por três segmentos de algarismos, sendo o
primeiro o número da inscrição propriamente dito; o segundo (após a barra) o número de
filiais, e o terceiro representados pelos últimos dois valores que são os dígitos
verificadores.
Oficialmente, o cálculo do número do CNPJ prevê também a verificação do oitavo dígito,
mas algumas empresas possuem números que ao serem validados segundo esse critério
são considerados inválidos.
Por isso, o mais seguro é você fazer a validação dos dígitos verificadores, pois assim
nenhum número será inválido e sua rotina está protegida da mesma forma, já que a regra
é única e funciona com qualquer CNPJ válido.
Fazendo o cálculo do primeiro dígito verificador
Vamos mostrar o modo de cálculo de modo prático, para isso vamos adotar um número de
CNPJ hipotético e calcularemos seus dígitos verificadores: 11.222.333/0001-XX.
Vamos começar alinhando os números que compõe o CNPJ com os algarismos
5,4,3,2,9,8,7,6,5,4,3 e 2 nesta ordem, veja:
Números
do CNPJ
1 1 2 2 2 3 3 3 0 0 0 1
Valores
definidos
para o
cálculo
5 4 3 2 9 8 7 6 5 4 3 2
Feito isso efetuaremos a multiplicação de cada uma das colunas, assim:
Números 1 1 2 2 2 3 3 3 0 0 0 1
Design Banco de Dados Mercado CMS Framework APIs Desenvolvimento Mídia e Marketing Digital Tecnologia
Por uma internet mais criativa e dinâmica
Anúncios Google Baixar Música CPF CNPJ Musicas MP3
NOTÍCIAS
11h40
Android Market deve ultrapassarApple Store em número deaplicativos este ano
10h30
Apple lança iOS 4.3 e corrigeproblemas no sistema delocalização
09h20
Ibope: Brasil possui 43 milhõesde internautas
17h40
Google lança Google Web Toolkit2.3
16h35
App stores devem movimentarUS$ 3,8 bilhões em 2011
VER MAIS NOTÍCIAS
Algoritmo do CNPJ – iMasters http://imasters.com.br/artigo/2451/javascript/algoritmo-do-cnpj
1 de 7 5/5/2011 12:13
do CNPJ
Valores
definidos
para o
cálculo
5 4 3 2 9 8 7 6 5 4 3 2
Total 5 4 6 4 18 24 21 18 0 0 0 2
Com os valores encontrados em cada uma das colunas efetuaremos o somatório, desta
forma: 5+4+6+4+18+24+21+18+0+0+0+2 e com o número obtido, nesse caso 102,
realizaremos a divisão por 11 (102/11).
Vamos considerar como quociente somente o valor inteiro, o resto da divisão será
responsável pelo cálculo do primeiro dígito verificador. Assim sendo, no nosso caso o
resto da divisão é o número 3.
Neste momento temos a seguinte regra: Caso o resto da divisão seja menor que 2, o valor
do dígito verificador passa a ser 0. Caso contrário, subtraímos o valor de 11 para obter o
dígito, que é o nosso caso. Portanto, nosso primeiro dígito verificador é (11 - 3) o número
8.
Para seguirmos com a nossa validação tomaremos o CNPJ com o primeiro dígito já
calculado para efetuarmos a validação do segundo e último dígito verificador:
11.222.333/0001-8X.
Fazendo o cálculo do segundo dígito verificador
O processo é semelhante a primeira etapa, a única mudança é a seqüência de números
que serão alinhados na tabela, como a tabela ficou maior com a presença do dígito já
calculado a seqüência agora tem que ter mais um número e ficará assim:
6,5,4,3,2,9,8,7,6,5,4,3 e 2, confira:
Números
do CNPJ
1 1 2 2 2 3 3 3 0 0 0 1 8
Valores
definidos
para o
cálculo
6 5 4 3 2 9 8 7 6 5 4 3 2
Feito isso efetuaremos a multiplicação de cada uma das colunas, assim:
Números
do CNPJ
1 1 2 2 2 3 3 3 0 0 0 1 8
Valores
definidos
para o
cálculo
6 5 4 3 2 9 8 7 6 5 4 3 2
Total 6 5 8 6 4 27 24 21 0 0 0 3 16
Como você pode notar efetuamos também, como na primeira etapa, a multiplicação das
colunas e faremos agora o somatório das resultados obtidos:
6+5+8+6+4+27+24+21+0+0+0+3+16. Com o resultado obtido, nesse caso 120,
efetuamos a divisão por 11.
Nessa divisão, assim como no cálculo anterior, vamos apenas considerar o valor inteiro do
quociente, pois o cálculo do último dígito verificador será feito com o resto da divisão
seguindo a seguinte regra: caso o resto da divisão seja menor que 2 (dois), esse valor
passa automaticamente a ser zero; caso contrário, que é o nosso caso, subtrai-se o resto
de 11 para obter o valor do último dígito verificador, acompanhe: 120/11=10 com resto 10,
11-10 dígito verificador 1 - Nosso CNPJ agora completo 11.222.333/0001-81.
Exemplo pratico da validação do CNPJ
Agora que já conhecemos como funciona o algoritmo do CNPJ, vamos partir para a
programação do nosso código, o nosso código é composto por uma função que vai
Encontre-nos no Facebook
Thiago Lucas Luana Teka Roni
Claudinéia Hugo Tomás Marcos Geraldo
iMasters
3,073 pessoas curtiram iMasters.
Curtir
Plug-in social do Facebook
CURSOS ONLINE
Criação de Loja Virtual com MagentoGerencie sua loja virtual com Magento E-commerce,
instalando módulos e templates, deixando-a com a sua
cara e necessidades.
Planos de Comunicação em Mídias DigitaisEsse curso foi desenvolvido para quem quer entender
as principais partes do processo de planejamento de
ações digitais e quais são os modelos aplicados de
planos de comunicação.
Algoritmo do CNPJ – iMasters http://imasters.com.br/artigo/2451/javascript/algoritmo-do-cnpj
2 de 7 5/5/2011 12:13
retornar um valor true ou false para que o formulário seja enviado ou não. Abaixo do
código tem uma descrição para um melhor acompanhamento e no fim da matéria um link
para o exemplo desenvolvido aqui.
1 <script language="Javascript">
2 function validaCNPJ() {
3 CNPJ = document.validacao.CNPJID.value;
4 erro = new String;
5 if (CNPJ.length < 18) erro += "É necessario preencher corretamente o número
do CNPJ! \n\n";
6 if ((CNPJ.charAt(2) != ".") || (CNPJ.charAt(6) != ".") || (CNPJ.charAt(10) != "/")
|| (CNPJ.charAt(15) != "-")){
7 if (erro.length == 0) erro += "É necessário preencher corretamente o número
do CNPJ! \n\n";
8 }
9 //substituir os caracteres que não são números
10 if(document.layers && parseInt(navigator.appVersion) == 4){
11 x = CNPJ.substring(0,2);
12 x += CNPJ. substring (3,6);
13 x += CNPJ. substring (7,10);
14 x += CNPJ. substring (11,15);
15 x += CNPJ. substring (16,18);
16 CNPJ = x;
17 } else {
18 CNPJ = CNPJ. replace (".","");
19 CNPJ = CNPJ. replace (".","");
20 CNPJ = CNPJ. replace ("-","");
21 CNPJ = CNPJ. replace ("/","");
22 }
23 var nonNumbers = /\D/;
24 if (nonNumbers.test(CNPJ)) erro += "A verificação de CNPJ suporta apenas
números! \n\n";
25 var a = [];
26 var b = new Number;
27 var c = [6,5,4,3,2,9,8,7,6,5,4,3,2];
28 for (i=0; i<12; i++){
29 a[i] = CNPJ.charAt(i);
30 b += a[i] * c[i+1];
31 }
32 if ((x = b % 11) < 2) { a[12] = 0 } else { a[12] = 11-x }
33 b = 0;
34 for (y=0; y<13; y++) {
35 b += (a[y] * c[y]);
36 }
37 if ((x = b % 11) < 2) { a[13] = 0; } else { a[13] = 11-x; }
38 if ((CNPJ.charAt(12) != a[12]) || (CNPJ.charAt(13) != a[13])){
39 erro +="Dígito verificador com problema!";
40 }
41 if (erro.length > 0){
42 alert(erro);
43 return false;
44 } else {
45 alert("CNPJ valido!");
46 }
47 return true;
48 }
49 </script>
Linha 3 – Declaração da variável CNPJ responsável por recuperar o valor do campo que
contem o número do CNPJ.
Linha 5 – Verificação se o tamanho da variável é menor que 18. Se retonar true a variável
erro vai ser Verificação com um texto referente ao erro.
Linha 6 – Verificação se o CNPJ foi preenchido corretamente com os números e dígitos
extras. Se retornar true uma nova verificacao sera feita para saber se o tamanho da
Efeitos digitais com Photoshop e IllustratorO curso mostra de forma objetiva uma gama de
possibilidades nos softwares de edição de imagens
mais utilizados no mundo: Photoshop & llustrator CS4.
Celular 3 Chips R$ 99,90
2 Câmeras, Tv, FM, MP3, Bluetooth Frete Grátispara todo BrasilCompreDaChina.com/SuperOferta
Programa Controle Estoque
Programa totalmente online de controle deestoquewww.egestor.com.br
Servidor Asp?
Hospede seu site com o UOL HOST. Planos porR$12,90*. Confira aqui!www.UOLHOST.com.br
Peixe Urbano: Cadastre-seCadastre-se em 5 Seg e Receba Todo DiaOfertas de 50-90% de Desconto!PeixeUrbano.com.br/Cadastre-se
Algoritmo do CNPJ – iMasters http://imasters.com.br/artigo/2451/javascript/algoritmo-do-cnpj
3 de 7 5/5/2011 12:13
variável erro é igual a 0, se retonar true a variável erro vai ser incrementada com um texto
referente ao erro.
Obs.: A verificação se se o tamanho da variável erro é igual a 0 é para não repetir a
mesma mensagem de erro.
Linha 10 – Verificação se o navegador é o Netscape 4. Se retornar true, a variável x ficará
responsável por recuperar os valores das partes da variável CNPJ. O propósito disso
seria retirar os caracteres extras como “.”, “/” e “-”. Ao final, a mesma variável CNPJ
recebe o valor de x, assim ficando apenas com números.
Se o navegador não for o Netscape 4, o método replace sera utilizado para substituir os
caracteres extras por espaço vazio, assim ficando apenas números na variável CNPJ.
Linha 23 – Declaração da variável nonNumbers utilizando expressão regular.
Linha 24 – Verificação se a variável CNPJ contém algum caractere que não seja número.
Se retonar true, a variável erro vai ser incrementada com um texto referente ao erro.
Linha 25 – Declaração da matriz a;
Linha 26 – Declaração da variável b como número;
Linha 27 – Declaração da variável c como matriz copulada com os valores a serem
multiplicados pelos números do CNPJ para a validação dos dígitos verificadores.
Linha 28 – Loop que vai ser executado 12 vezes.
Linha 29 – A matriz a indexada do valor da variável do loop recebe o caractere da variável
CNPJ indexada do valor da variável do loop.
Linha 30 – A variável b é incrementada com o valor da matriz a indexada do valor da
variável do loop multiplicada pelo valor da matriz c indexada do valor da variável do loop
acrescida de 1.
Linha 32 – Verificação se a variável x (que tem o valor do resto da divisão de b por 11) é
menor que 2. Se retornar true, a matriz a indexada de 12 recebe o valor de 0. Se retornar
false a matriz a indexada de 12 recebe o valor de 11 menos o valor de x.
Linha 33 – A variável b é reiniciada.
Linha 34 – Loop que vai ser executado 13 vezes.
Linha 35 – A variável b é incrementada com o valor da matriz a indexada do valor da
variável do loop multiplicada pelo valor da matriz c indexada do valor da variável do loop.
Linha 37 – Verificação se a variável x (que tem o valor do resto da divisão de b por 11) é
menor que 2. Se retornar true, a matriz a indexada de 13 recebe o valor de 0. Se retornar
false, a matriz a indexada de 13 recebe o valor de 11 menos o valor de x.
Linha 38 – Verificação se o caractere 12 da variável CNPJ é diferente da matriz a
indexada de 12, ou, se o caractere 13 da variável CNPJ é diferente da matriz a indexada
de 13. Se retonar true, a variável erro vai ser incrementada com um texto referente ao
erro.
Linha 41 – Verificação se o tamanho da variável erro é maior que 0. Se retornar true, uma
caixa de alerta surge a mesagem do(s) erro(s) gerados e a função retorna false. Se
retornar false, uma caixa de alerta surge com a mensagem “CNPJ válido!”.
Linha 47 – Se tudo ocorreu bem a função vai retornar true e o formulário vai ser enviado.
Finalizando o código
Como a função validaCNPJ pronta, vamos partir para a parte HTML com a criação do
formulário que suportara o caixa de texto para digitar o número do CNPJ. O evento
onSubmit do formulário é usado para retornar um valor para verificar se o mesmo vai ser
enviado.
1 <form action="validaCNPJ.htm" name="validacao" onSubmit="return validaCNPJ()">
2 <input type="text" name="CNPJID" id="CNPJID" size="25" maxlength="18">
3 <input name="Submit" type="submit" value="enviar">
4 </form>
5 Digite o número do CNPJ com os caracteres ".", "/" ou "-".
6 Ex. 03.335.456/0001-45
Com essa explicação, você poderá montar sua própria rotina ou utilizar a que criamos.
Abaixo segue o link para o exemplo criado aqui.
Algoritmo do CNPJ – iMasters http://imasters.com.br/artigo/2451/javascript/algoritmo-do-cnpj
4 de 7 5/5/2011 12:13
COMENTE TAMBÉM
Confira o exemplo do código: validaCNPJ.htm.
Créditos: Parte deste artigo foi retirado do site Clube da Informática, com alterações e
informações adicionadas por mim.
Valeu galera e até a próxima semana!
Thiago Prado Atua profissionalmente com desenvolvimento de projetos web
em Flash, PHP e Java.
Página do autor Email
12 COMENTÁRIOS
Donato
Thiago, como sempre acompanho seus artigos de Javascript, pois são muito
esclarecedores para mim, iniciante em DHtml. Peço a você, se possível, que faça um artigo
sobre expressões regulares, mostrando qual a sua funcionalidade (pois não tenho
informação nenhuma sobre RE). Não tenho noção sobre o uso de expressão regular e de
sua importância. Se puder atender o pedido fico grato.
donato.
Há 6 anos · Responder
Thiago Prado
Tenho muito prazer em escrever colunas sobre que os leitores necessitam...
Há 6 anos · Responder
Renato Amadeu
Thiago,
Preciso de fazer um sistema parecido com o do imasters, sendo que ao inves de ao clicar
em imprimir matéria ele abrir uma janela com formatação e tal queria que imprimisse direto
pra impressora sem abrir janela alguma entende?
Há 6 anos · Responder
Julian Fernando
Puxa, mais uma vez vocês da iMaster arrasaram este algorítmo em javascript é bastante
esclarecedor . O thiago Prado mais uma vez descreveu com detalhes e clareza um bom
algorítmo que valida CNPJ, e o melhor em JavaScript.
Parabéns Thiago
Há 6 anos · Responder
Valfrid
Essa rotina eu já tenho a muito tempo porém, a própria receita tem divulgado um CNPJ de
15 dígitos (19 com a máscara) e essa rotina, como a minha, só valida CNPJs de 14 dígitos!!
Alguém sabe como fazer?
Há 6 anos · Responder
Wellington Guedes
Thiago, grande matéria, bastante esclarecedora, parabéns pelo excelente trabalho.
Sou consultar da área de Imposto de Renda da IOB-Thomsom, este trabalho será de
utilidade inestimável para min.
Na verdade faltava um trabalho que abrangesse esse assunto.
Grande abraço.
Há 6 anos · Responder
Plinio Marcos Cruz
Agradeço os créditos prezado Thiago. Convido vocêa escrever um artigo para o Clube -
http://www.clubedainformatica.com.br
Há 6 anos · Responder
ricardo silveira
Artigo muito bom! parabéns, só faltou colocar um if para se o cnpj for 00.000.000/0000-00
Há 4 anos · Responder
Alberto Tarastchuk
Prezado Thiago
Algoritmo do CNPJ – iMasters http://imasters.com.br/artigo/2451/javascript/algoritmo-do-cnpj
5 de 7 5/5/2011 12:13
Parabéns pela matéria, vc teria esse código de validação de CNPJ sem precisar colocar os
caracteres extras como ?.?, ?/? e ?-?. Fico agradecido desde já.
Há 3 anos · Responder
Junio Kenedy
Prezado Thiago,
Poderia me explicar o porque da divisão por 11 do valor total da somatória?
Há 2 anos · Responder
Victor Silva
Dá uma olhada nesse framework, www.lindbergframework.org
Com ele você pode fazer qualquer tipo de validação, pode criar as suas próprias, mesclar
várias validações para compor uma outra validação e mais, o framework lhe dá suporte a
annotations também o que faz com que vc possa configurar suas validações em seus beans
utilizando annotations. Mesmo as validações que o framework já oferece como CNPJ, CPF,
DATAS, VALORES, COMPARAÇÕES DE OBJETOS, ETC... bem como as suas validações
criadas tb podem ser usadas com as annotations do framework.
Esse framework trabalha com o spring (mas não lhe obriga a usa-lo tb) criando um contexto
de beans de validações. O framework é extensível e seu uso customizável.
VAle a pena dá uma olhada.
O site mais uma vez: www.lindbergframework.org
FLw
Há 1 ano · Responder
Rudinei
Parabens,
Muito bom seus comentários, auxiliam muito na compreensão desta lógica.
Abraço
Há 11 meses · Responder
QUAL A SUA OPINIÃO?
PARCEIROS
Sobre o iMasters
Política de privacidade
Algoritmo do CNPJ – iMasters http://imasters.com.br/artigo/2451/javascript/algoritmo-do-cnpj
6 de 7 5/5/2011 12:13
© 2001 iMasters FFPA Informática Ltda
Todos os direitos reservados.
Anuncie
Fale conosco
Algoritmo do CNPJ – iMasters http://imasters.com.br/artigo/2451/javascript/algoritmo-do-cnpj
7 de 7 5/5/2011 12:13