Você está na página 1de 13

Validando CNPJ

O nmero que compe o CNPJ composto por trs segmentos de algarismos,


sendo o primeiro o nmero da inscrio propriamente dito, o segundo (aps a
barra) o nmero de filiais e o terceiro representados pelos ltimos dois valores que
so os dgitos verificadores.
Oficialmente o clculo do nmero do CNPJ prev tambm a verificao do oitavo
dgito, mas algumas empresas possuem nmeros que ao serem validados segundo
esse critrio so considerados invlidos.
Por isso o mais seguro voc fazer a validao dos dgitos verificadores, pois
assim nenhum nmero ser invlido e sua rotina est protegida da mesma forma,
j que a regra nica e funciona com qualquer CNPJ vlido

Validando os dgitos verificadores


Vamos mostrar o modo de clculo de modo prtico, para isso vamos adotar um
nmero de CNPJ hipottico e calcularemos seus dgitos verificadores:
11.222.333/0001-XX.
Vamos comear alinhando os nmeros que compe o CNPJ com os algarismos
5,4,3,2,9,8,7,6,5,4,3 e 2 nesta ordem, veja:
1

Feito isso efetuaremos a multiplicao de cada uma das colunas, assim:


1

18

24

21

18

Com os valores encontrados em cada uma das colunas efetuaremos o somatrio,


desta forma: 5+4+6+4+18+24+21+18+0+0+0+2 e com o nmero obtido, nesse
caso 102, realizaremos a diviso por 11 (102/11).
Vamos considerar como quociente somente o valor inteiro, o resto da diviso
ser responsvel pelo clculo do primeiro dgito verificador. Assim sendo, no nosso
caso o resto da diviso o nmero 3.
Neste momento temos a seguinte regra: Caso o resto da diviso seja menor que
2 o valor do dgito verificador passa a ser 0, caso contrrio subtramos o valor de 11
para obter o dgito, que o nosso caso, portanto nosso primeiro dgito verificador
(11 - 3) o nmero 8.
Para seguirmos com a nossa validao tomaremos o CNPJ com o primeiro dgito
j calculado para efetuarmos a validao do segundo e ltimo dgito verificador:
11.222.333/0001-8X.
O processo semelhante a primeira etapa, a nica mudana a seqncia de
nmeros que sero alinhados na tabela, como a tabela ficou maior com a presena
do dgito j calculado a seqncia agora tem que ter mais um nmero e ficar
assim: 6,5,4,3,2,9,8,7,6,5,4,3 e 2, confira:
1

27

24

21

16

Como voc pode notar efetuamos tambm, como na primeira etapa, a


multiplicao das colunas e faremos agora o somatrio 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 diviso por 11.
Nessa diviso, assim como no clculo anterior, vamos apenas considerar o valor
inteiro do quociente, pois o clculo do ltimo dgito verificador ser feito com o
resto da diviso seguindo a seguinte regra: caso o resto da diviso seja menor que
2 (dois), esse valor passa automaticamente a ser zero; caso contrrio, que o
nosso caso, subtrai-se o resto de 11 para obter o valor do ltimo dgito verificador,
acompanhe: 120/11=10 com resto 10, 11-10 dgito verificador 1 - Nosso CNPJ
agora completo 11.222.333/0001-81
Plnio Cruz (Analista de Sistemas / Consultor em Informtica)

O que DV mdulo 11 e o que DV mdulo 10 ?


DV (Dgito de Verificao), tambm denominado nmero-controle, so dgitos incorporados a
nmeros para possibilitar a deteco de erros de digitao, no ato. Recurso muito difundido, por
exemplo, na numerao de contas de depsitos bancrios.
No caso do CNPJ, o DV mdulo 11 corresponde ao resto da diviso por 11 do somatrio da
multiplicao de cada algarismo da base respectivamente por 9, 8, 7, 6, 5, 4, 3, 2, 9, 8, 7, 6 e 5, a
partir da unidade. O resto 10 considerado 0 (algumas instituies, como o Banco do Brasil,
tratam o 10, em seus nmeros de contas, como "X").
O DV mdulo 10 corresponde ao nmero que faltar para inteirar mltiplo de 10, em relao ao
somatrio da multiplicao de cada algarismo da base respectivamente por 2, 1, 2, 1, 2, 1 e 2, a
partir da unidade, sendo que em cada multiplicao valores superiores a 9 devero sofrer a
operao "noves fora".
Veja, abaixo, exemplo de clculo de DV mdulo 11 (o mais usado pelos bancos) e de DV mdulo
10 para o CNPJ n 18781203/0001:
1 8 7 8 1 2 0 3 0 0 0 1 = 2
x x x x x x x x x x x x
6 7 8 9 2 3 4 5 6 7 8 9
---------------------------------6+56+56+72+ 2+ 6+ 0+15+ 0+ 0+ 0+ 9 = 22211=20, com resto 2
1 8 7 8 1 2 0 3 0 0 0 1 2 = 8
x x x x x x x x x x x x x
5 6 7 8 9 2 3 4 5 6 7 8 9
------------------------------------5+48+49+64+ 9+ 4+ 0+12+ 0+ 0+ 0+ 8+18 = 21711=19, com resto 8
Portanto,

CNPJ+DV = 18781203/0001-28

-----------------------------------------------------Conferncia do oitavo dgito:


1 8 7 8 1 2 0 = 3
x x x x x x x
2 1 2 1 2 1 2
------------------2+ 8+ 5*+8+ 2+ 2 +0 = 27, para 30 = 3 (*noves fora)

Criando a classe para validao de CNPJ e CPF

Como eu j disse o meu objetivo mostrar como podemos usar propriedades de


objetos para efetuar validao. Vamos criar a classe com suas propriedades e
mtodos e depois mostrar como podemos us-la para efetuar a validao de CNPJ
e CPF.
Comece criando um novo projeto do VB.NET do tipo Windows Application usando a
linguagem VB.NET.
No menu Project selecione a opo Add Class e informe o nome
valida_CNPJ_CPF.vb clicando a seguir no boto Open.
A primeira coisa que vamos fazer definir as propriedades da classe definindo as
seguintes variveis :
Private dadosArray() As String = {"111.111.111-11", "222.222.222-22",
"333.333.333-33", "444.444.444-44", _
"555.555.555-55", "666.666.666-66",
"777.777.777-77", "888.888.888-88", "999.999.999-99"}
Private
Private
Private
Private

Const msgErro As String = "Dados Invlidos"


bValida As Boolean
sCPF As String
sCNPJ As String

Criarei agora a propriedade cpf(). Com esta propriedade estaremos permitindo a


definio de um valor para o CPF e a obteno do valor do cpf atribudo. Note que
se o cpf for invlido estamos lanando uma exceo. Poderamos tambm ter
atribudo um outro valor ao membro sCPF e feito o tratamento posteriormente.
Public Property cpf() As String
Get
Return sCPF
End Get
Set(ByVal Valor As String)
bValida = ValidaCPF(Valor)
If bValida Then
sCPF = Valor
Else
Throw (New System.ArgumentException(msgErro,
"Numero do CPF"))
End If
End Set
End Property
A outra propriedade que criamos chama-se isCpfValido() que retorna True/False
e usa o mtodo ValidaCPF(cpf) passando como parmetro o valor atribudo a
propriedade cpf. Note que esta propriedade somente leitura (ReadOnly), ou
seja, s podemos obter valores atravs dela e no atribuir.
Public ReadOnly Property isCpfValido() As Boolean
Get
bValida = ValidaCPF(cpf)
If bValida Then
Return True

Else
Return False
End If
End Get
End Property
Da mesma forma vou criar duas propriedades para o CNPJ: cnpj() e
isCnpjValido(cnpj), cujo cdigo exibo a seguir:
Public Property cnpj() As String
Get
Return sCNPJ
End Get
Set(ByVal Valor As String)
bValida = ValidaCNPJ(Valor)
If bValida Then
sCNPJ = Valor
Else
Throw (New
System.ArgumentException(msgErro, "Numero do
CNPJ"))
End If
End Set
End Property
Public ReadOnly Property isCnpjValido() As
Boolean
Get
bValida = ValidaCNPJ(cnpj)
If bValida Then
Return True
Else
Return False
End If
End Get
End Property

Falta exibir o cdigo dos mtodo da classe que fazem a validao do CPF e CNPJ.
A funo ValidaCPF() possui o seguinte cdigo:
Private Function ValidaCPF(ByVal CPF As String) As
Boolean
Dim i, x, n1, n2 As Integer
CPF = CPF.Trim
For i = 0 To dadosArray.Length - 1
If CPF.Length <> 14 Or dadosArray(i).Equals(CPF) Then
Return False
End If
Next
'remove a maskara
CPF = CPF.Substring(0, 3) + CPF.Substring(4, 3) +

CPF.Substring(8, 3) + CPF.Substring(12)
For x = 0 To 1
n1 = 0
For i = 0 To 8 + x
n1 = n1 + Val(CPF.Substring(i, 1)) * (10 + x - i)
Next
n2 = 11 - (n1 - (Int(n1 / 11) * 11))
If n2 = 10 Or n2 = 11 Then n2 = 0
If n2 <> Val(CPF.Substring(9 + x, 1)) Then
Return False
End If
Next
Return True
End Function
O mtodo ValidaCNPJ() e o mtodo efetivaValidao() so exibidos a seguir:
Private Function ValidaCNPJ(ByVal CNPJ As String)
As Boolean
Dim i As Integer
Dim valida As Boolean
CNPJ = CNPJ.Trim
For i = 0 To dadosArray.Length - 1
If CNPJ.Length <> 18 Or
dadosArray(i).Equals(CNPJ) Then
Return False
End If
Next
'remove a maskara
CNPJ = CNPJ.Substring(0, 2) + CNPJ.Substring(3, 3) +
CNPJ.Substring(7, 3) + CNPJ.Substring(11, 4) +
CNPJ.Substring(16)
valida = efetivaValidacao(CNPJ)
If valida Then
ValidaCNPJ = True
Else
ValidaCNPJ = False
End If
End Function
Private Function efetivaValidacao(ByVal cnpj As
String)
Dim Numero(13) As Integer
Dim soma As Integer
Dim i As Integer
Dim valida As Boolean
Dim resultado1 As Integer
Dim resultado2 As Integer
For i = 0 To Numero.Length - 1

Numero(i) = CInt(cnpj.Substring(i, 1))


Next
soma = Numero(0) * 5 + Numero(1) * 4 + Numero(2)
* 3 + Numero(3) * 2 + Numero(4) * 9 + Numero(5) * 8 +
Numero(6) * 7 + _
Numero(7) * 6 + Numero(8) * 5 + Numero(9)
* 4 + Numero(10) * 3 + Numero(11) * 2
soma = soma - (11 * (Int(soma / 11)))
If soma = 0 Or soma = 1 Then
resultado1 = 0
Else
resultado1 = 11 - soma
End If
If resultado1 = Numero(12) Then
soma = Numero(0) * 6 + Numero(1) * 5 +
Numero(2) * 4 + Numero(3) * 3 + Numero(4) * 2 +
Numero(5) * 9 + Numero(6) * 8 + _
Numero(7) * 7 + Numero(8) * 6 +
Numero(9) * 5 + Numero(10) * 4 + Numero(11) * 3 +
Numero(12) * 2
soma = soma - (11 * (Int(soma / 11)))
If soma = 0 Or soma = 1 Then
resultado2 = 0
Else
resultado2 = 11 - soma
End If
If resultado2 = Numero(13) Then
Return True
Else
Return False
End If
Else
Return False
End If
End Function

Efetuando a validao dos dados


Acione o menu Project e selecione Add Windows Form e Inclua um formulrio no projeto; neste
formulrio inclua os controles : TextBox e Button conforme abaixo:

Para efetuar validao do CPF inclua no evento Click do boto - Valida CPF - o seguinte cdigo:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim cpf1 As New valida_CNPJ_CPF
cpf1.cpf = TextBox1.Text
If cpf1.isCpfValido()

Algoritmo do CNPJ

Segunda-feira, 16/08/2004 s 15h06, por Thiago Prado


Nesta semana vamos entender um pouco como funciona o algoritmo do CNPJ. A lgica
para saber se o CNPJ verdadeiro, necessrio fazer um clculo para validar os dgitos
verificadores, que so responsveis por diferenciar um CNPJ de outro.
Como hoje em dia muito comum as empresas utilizarem sistemas baseados em
linguagens de internet, a validao de dados se torna muito importante para que o
sistema no gere erros. Esse algoritmo que responsvel pela validao do CNPJ foi
feito de acordo com a regras do Ministrio da Fazenda.
O cdigo abaixo foi testado nos seguintes browsers:
Internet Explorer 4+
Netscape 4+
Opera 7
Mozilla 1.6

Conhecendo o clculo do algoritmo do CNPJ


O nmero que compe o CNPJ composto por trs segmentos de algarismos, sendo o
primeiro o nmero da inscrio propriamente dito; o segundo (aps a barra) o nmero
de filiais, e o terceiro representados pelos ltimos dois valores que so os dgitos
verificadores.
Oficialmente, o clculo do nmero do CNPJ prev tambm a verificao do oitavo
dgito, mas algumas empresas possuem nmeros que ao serem validados segundo esse
critrio so considerados invlidos.
Por isso, o mais seguro voc fazer a validao dos dgitos verificadores, pois assim
nenhum nmero ser invlido e sua rotina est protegida da mesma forma, j que a regra
nica e funciona com qualquer CNPJ vlido.
Fazendo o clculo do primeiro dgito verificador
Vamos mostrar o modo de clculo de modo prtico, para isso vamos adotar um nmero
de CNPJ hipottico e calcularemos seus dgitos verificadores: 11.222.333/0001-XX.
Vamos comear alinhando os nmeros que compe o CNPJ com os algarismos
5,4,3,2,9,8,7,6,5,4,3 e 2 nesta ordem, veja:
Nmeros do CNPJ

1 1 2 2 2 3 3 3 0 0 0 1

Valores definidos
para o clculo

5 4 3 2 9 8 7 6 5 4 3 2

Feito isso efetuaremos a multiplicao de cada uma das colunas, assim:


Nmeros do CNPJ

1 1 2 2 2

0 0 0 1

Valores definidos
para o clculo

5 4 3 2 9

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 somatrio, desta
forma: 5+4+6+4+18+24+21+18+0+0+0+2 e com o nmero obtido, nesse caso 102,
realizaremos a diviso por 11 (102/11).
Vamos considerar como quociente somente o valor inteiro, o resto da diviso ser
responsvel pelo clculo do primeiro dgito verificador. Assim sendo, no nosso caso o
resto da diviso o nmero 3.

Neste momento temos a seguinte regra: Caso o resto da diviso seja menor que 2, o
valor do dgito verificador passa a ser 0. Caso contrrio, subtramos o valor de 11 para
obter o dgito, que o nosso caso. Portanto, nosso primeiro dgito verificador (11 - 3)
o nmero 8.
Para seguirmos com a nossa validao tomaremos o CNPJ com o primeiro dgito j
calculado para efetuarmos a validao do segundo e ltimo dgito verificador:
11.222.333/0001-8X.
Fazendo o clculo do segundo dgito verificador
O processo semelhante a primeira etapa, a nica mudana a seqncia de nmeros
que sero alinhados na tabela, como a tabela ficou maior com a presena do dgito j
calculado a seqncia agora tem que ter mais um nmero e ficar assim:
6,5,4,3,2,9,8,7,6,5,4,3 e 2, confira:
Nmeros do CNPJ

1 1 2 2 2 3 3 3 0 0 0 1 8

Valores definidos
para o clculo

6 5 4 3 2 9 8 7 6 5 4 3 2

Feito isso efetuaremos a multiplicao de cada uma das colunas, assim:


Nmeros do CNPJ 1 1 2 2 2 3

0 0 0 1 8

Valores definidos
para o clculo

6 5 4 3 2 9

6 5 4 3 2

Total

6 5 8 6 4 27 24 21 0 0 0 3 16

Como voc pode notar efetuamos tambm, como na primeira etapa, a multiplicao das
colunas e faremos agora o somatrio 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 diviso por 11.
Nessa diviso, assim como no clculo anterior, vamos apenas considerar o valor inteiro
do quociente, pois o clculo do ltimo dgito verificador ser feito com o resto da
diviso seguindo a seguinte regra: caso o resto da diviso seja menor que 2 (dois), esse
valor passa automaticamente a ser zero; caso contrrio, que o nosso caso, subtrai-se o
resto de 11 para obter o valor do ltimo dgito verificador, acompanhe: 120/11=10 com
resto 10, 11-10 dgito verificador 1 - Nosso CNPJ agora completo 11.222.333/0001-81.
Exemplo pratico da validao do CNPJ

Agora que j conhecemos como funciona o algoritmo do CNPJ, vamos partir para a
programao do nosso cdigo, o nosso cdigo composto por uma funo que vai
retornar um valor true ou false para que o formulrio seja enviado ou no. Abaixo do
cdigo tem uma descrio para um melhor acompanhamento e no fim da matria 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
nmero do CNPJ! \n\n";
6
if ((CNPJ.charAt(2) != ".") || (CNPJ.charAt(6) != ".") || (CNPJ.charAt(10) !=
"/") || (CNPJ.charAt(15) != "-")){
7
if (erro.length == 0) erro += " necessrio preencher corretamente o nmero
do CNPJ! \n\n";
8
}
9
//substituir os caracteres que no so nmeros
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 verificao de CNPJ suporta apenas
nmeros! \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 +="Dgito 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 Declarao da varivel CNPJ responsvel por recuperar o valor do campo que
contem o nmero do CNPJ.
Linha 5 Verificao se o tamanho da varivel menor que 18. Se retonar true a
varivel erro vai ser Verificao com um texto referente ao erro.
Linha 6 Verificao se o CNPJ foi preenchido corretamente com os nmeros e dgitos
extras. Se retornar true uma nova verificacao sera feita para saber se o tamanho da
varivel erro igual a 0, se retonar true a varivel erro vai ser incrementada com um
texto referente ao erro.
Obs.: A verificao se se o tamanho da varivel erro igual a 0 para no repetir a
mesma mensagem de erro.
Linha 10 Verificao se o navegador o Netscape 4. Se retornar true, a varivel x
ficar responsvel por recuperar os valores das partes da varivel CNPJ. O propsito
disso seria retirar os caracteres extras como ., / e -. Ao final, a mesma varivel
CNPJ recebe o valor de x, assim ficando apenas com nmeros.
Se o navegador no for o Netscape 4, o mtodo replace sera utilizado para substituir os
caracteres extras por espao vazio, assim ficando apenas nmeros na varivel CNPJ.
Linha 23 Declarao da varivel nonNumbers utilizando expresso regular.
Linha 24 Verificao se a varivel CNPJ contm algum caractere que no seja
nmero. Se retonar true, a varivel erro vai ser incrementada com um texto referente ao
erro.
Linha 25 Declarao da matriz a;

Linha 26 Declarao da varivel b como nmero;


Linha 27 Declarao da varivel c como matriz copulada com os valores a serem
multiplicados pelos nmeros do CNPJ para a validao dos dgitos verificadores.
Linha 28 Loop que vai ser executado 12 vezes.
Linha 29 A matriz a indexada do valor da varivel do loop recebe o caractere da
varivel CNPJ indexada do valor da varivel do loop.
Linha 30 A varivel b incrementada com o valor da matriz a indexada do valor da
varivel do loop multiplicada pelo valor da matriz c indexada do valor da varivel do
loop acrescida de 1.
Linha 32 Verificao se a varivel x (que tem o valor do resto da diviso 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 varivel b reiniciada.
Linha 34 Loop que vai ser executado 13 vezes.
Linha 35 A varivel b incrementada com o valor da matriz a indexada do valor da
varivel do loop multiplicada pelo valor da matriz c indexada do valor da varivel do
loop.
Linha 37 Verificao se a varivel x (que tem o valor do resto da diviso 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 Verificao se o caractere 12 da varivel CNPJ diferente da matriz a
indexada de 12, ou, se o caractere 13 da varivel CNPJ diferente da matriz a indexada
de 13. Se retonar true, a varivel erro vai ser incrementada com um texto referente ao
erro.
Linha 41 Verificao se o tamanho da varivel erro maior que 0. Se retornar true,
uma caixa de alerta surge a mesagem do(s) erro(s) gerados e a funo retorna false. Se
retornar false, uma caixa de alerta surge com a mensagem CNPJ vlido!.
Linha 47 Se tudo ocorreu bem a funo vai retornar true e o formulrio vai ser
enviado.
Finalizando o cdigo

Como a funo validaCNPJ pronta, vamos partir para a parte HTML com a criao do
formulrio que suportara o caixa de texto para digitar o nmero do CNPJ. O evento
onSubmit do formulrio 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 nmero do CNPJ com os caracteres ".", "/" ou "-".
6 Ex. 03.335.456/0001-45
Com essa explicao, voc poder montar sua prpria rotina ou utilizar a que criamos.
Abaixo segue o link para o exemplo criado aqui.
Confira o exemplo do cdigo: validaCNPJ.htm.
Crditos: Parte deste artigo foi retirado do site Clube da Informtica, com alteraes e
informaes adicionadas por mim.
Valeu galera e at a prxima semana!

Você também pode gostar