Algoritmo de validação e máscara de CNPJ alfanumérico.
O identificador tem:
- 12 caracteres base alfanuméricos (0–9, A–Z)
- 2 dígitos verificadores numéricos finais (0–9)
A validação deve seguir módulo 11, em duas etapas, com pesos e mapeamento de caracteres definidos nestas instruções.
- A função deve receber uma string que representa o CNPJ alfanumérico, possivelmente formatada (por exemplo, com pontos, barra e hífen).
- Remover qualquer caractere que não seja letra (
A–Zoua–z) ou dígito (0–9), preservando apenas letras e dígitos. - Converter letras para maiúsculas.
- Após a normalização, o valor deve ter exatamente 14 caracteres:
- os 12 primeiros são a base alfanumérica
- os 2 últimos são os dígitos verificadores informados (que devem ser dígitos de 0 a 9).
Se, após essa etapa, a string não tiver 14 caracteres, a validação deve falhar.
Após a normalização:
- Posições 0 a 11 (12 primeiros caracteres): podem ser letras (
A–Z) ou dígitos (0–9). - Posições 12 e 13 (2 últimos caracteres): devem ser dígitos (
0–9), pois são os dígitos verificadores informados. - Se algum dos dois últimos caracteres não for dígito, a validação deve falhar.
Para cada caractere que participará do cálculo (tanto na base de 12 caracteres quanto quando o primeiro DV calculado for usado no cálculo do segundo DV), usar a seguinte regra de conversão:
-
Se for um dígito
'0'a'9':- valor numérico = 0 a 9, respectivamente.
-
Se for uma letra maiúscula
'A'a'Z':'A'→ 17'B'→ 18'C'→ 19- ...
'Z'→ 42
Ou seja, a sequência continua de forma incremental:
'A'vale 17,'B'18, ...,'Z'42.
-
Uma forma equivalente de implementar isso é:
- obter o código numérico do caractere (por exemplo, código ASCII)
- subtrair 48 desse código
- o resultado é o valor a ser usado no cálculo.
Essa mesma regra é usada tanto para os 12 caracteres base quanto para o primeiro dígito verificador quando ele entra no cálculo do segundo dígito.
Considere apenas os 12 primeiros caracteres normalizados.
-
Converter cada um dos 12 caracteres para o valor numérico, conforme a regra de mapeamento acima.
-
Associar a cada posição um peso, aplicando a sequência de 2 a 9 da direita para a esquerda, reiniciando em 2 depois de 9.
Para 12 caracteres, os pesos, da esquerda para a direita, devem ser exatamente:
[5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
-
Multiplicar o valor numérico de cada posição pelo respectivo peso.
-
Somar todos os produtos, obtendo um somatório
S1. -
Calcular o resto
R1da divisão deS1por 11 (ou seja,R1 = S1 mod 11). -
Determinar o primeiro dígito verificador (DV1) como:
- se
R1for 0 ou 1, entãoDV1 = 0 - caso contrário,
DV1 = 11 - R1
- se
Agora, considere os 12 caracteres base mais o primeiro dígito verificador calculado (DV1), totalizando 13 posições.
-
Formar uma nova sequência de 13 caracteres:
- as 12 posições originais da base
- seguidas do primeiro dígito verificador calculado (DV1), convertido para caractere dígito.
-
Converter cada uma das 13 posições para valor numérico, usando a mesma regra de mapeamento de caracteres descrita acima.
-
Associar a cada posição um peso, aplicando a sequência de 2 a 9 da direita para a esquerda, reiniciando em 2 depois de 9.
Para 13 posições, os pesos, da esquerda para a direita, devem ser exatamente:
[6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
-
Multiplicar o valor numérico de cada posição pelo respectivo peso.
-
Somar todos os produtos, obtendo um somatório
S2. -
Calcular o resto
R2da divisão deS2por 11 (ou seja,R2 = S2 mod 11). -
Determinar o segundo dígito verificador (DV2) como:
- se
R2for 0 ou 1, entãoDV2 = 0 - caso contrário,
DV2 = 11 - R2
- se
-
A partir da string normalizada de 14 caracteres:
- base = posições 0 a 11 (12 caracteres)
- DV informado 1 (DV1_informado) = posição 12
- DV informado 2 (DV2_informado) = posição 13
-
Calcular
DV1_calculadousando o método de cálculo do primeiro dígito descrito acima. -
Calcular
DV2_calculadousando o método de cálculo do segundo dígito descrito acima. -
Comparar:
DV1_calculadodeve ser igual aoDV1_informado;DV2_calculadodeve ser igual aoDV2_informado.
-
O CNPJ alfanumérico é considerado válido somente se ambos os dígitos calculados coincidirem com os dígitos informados.
Considere a base (12 caracteres):
1 2 A B C 3 4 5 0 1 D E
-
Converta para valores numéricos:
1 → 12 → 2A → 17B → 18C → 193 → 34 → 45 → 50 → 01 → 1D → 20E → 21
Fica:
[1, 2, 17, 18, 19, 3, 4, 5, 0, 1, 20, 21] -
Pesos para o primeiro dígito (da esquerda para a direita):
[5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
-
Produtos e somatório para o primeiro dígito:
1 * 5 = 52 * 4 = 817 * 3 = 5118 * 2 = 3619 * 9 = 1713 * 8 = 244 * 7 = 285 * 6 = 300 * 5 = 01 * 4 = 420 * 3 = 6021 * 2 = 42
Somatório
S1 = 5 + 8 + 51 + 36 + 171 + 24 + 28 + 30 + 0 + 4 + 60 + 42 = 459 -
Resto e DV1:
R1 = 459 mod 11 = 8DV1 = 11 - 8 = 3(comoR1não é 0 nem 1)
-
Sequência de 13 caracteres para o segundo dígito:
1 2 A B C 3 4 5 0 1 D E 3
-
Valores numéricos correspondentes:
1 → 12 → 2A → 17B → 18C → 193 → 34 → 45 → 50 → 01 → 1D → 20E → 213 → 3
Fica:
[1, 2, 17, 18, 19, 3, 4, 5, 0, 1, 20, 21, 3] -
Pesos para o segundo dígito (da esquerda para a direita):
[6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
-
Produtos e somatório para o segundo dígito:
1 * 6 = 62 * 5 = 1017 * 4 = 6818 * 3 = 5419 * 2 = 383 * 9 = 274 * 8 = 325 * 7 = 350 * 6 = 01 * 5 = 520 * 4 = 8021 * 3 = 633 * 2 = 6
Somatório
S2 = 6 + 10 + 68 + 54 + 38 + 27 + 32 + 35 + 0 + 5 + 80 + 63 + 6 = 424 -
Resto e DV2:
R2 = 424 mod 11 = 6DV2 = 11 - 6 = 5(comoR2não é 0 nem 1)
-
Assim, o CNPJ alfanumérico com base
12ABC34501DEe dígitos verificadores3e5é válido. Um formato possível para exibição é12.ABC.345/01DE-35, mas a validação deve ser feita sobre a forma normalizada sem pontuação.
Use estas máscaras apenas para exibição; a validação deve sempre trabalhar com a string normalizada (somente letras e dígitos, sem pontuação).
-
Entrada livre com formatação opcional
- Permitir o usuário digitar livremente letras (
A–Z,a–z) e dígitos (0–9), ignorando (ou inserindo automaticamente) os caracteres de máscara. - Ao exibir, aplicar a máscara padrão abaixo.
- Permitir o usuário digitar livremente letras (
-
Máscara padrão (14 caracteres, incluindo DV)
Considerando a sequência normalizada
BBBBBBBBBBBBDD(B = base alfanumérica, D = dígito verificador numérico):- Padrão visual recomendado:
BB.BBB.BBB/BBBD-DD
- Mapeamento de posições (índices da string normalizada de 0 a 13):
- posição 0 → B0
- posição 1 → B1
- ponto
. - posição 2 → B2
- posição 3 → B3
- posição 4 → B4
- ponto
. - posição 5 → B5
- posição 6 → B6
- posição 7 → B7
- barra
/ - posição 8 → B8
- posição 9 → B9
- posição 10 → B10
- posição 11 → B11
- hífen
- - posição 12 → D0
- posição 13 → D1
Exemplo com base alfanumérica e DV:
- Normalizado:
12ABC34501DE35 - Exibido:
12.ABC.345/01DE-35
- Padrão visual recomendado:
-
Comportamento em campos de digitação
- Pode-se aplicar a máscara progressivamente conforme o usuário digita:
- insere automaticamente
.após o 2º e 5º caracteres base - insere
/após o 8º caractere base - insere
-após o 12º caractere (quando iniciar os DVs)
- insere automaticamente
- Internamente, remover todos os caracteres não alfanuméricos antes de enviar para a função de validação.
- Pode-se aplicar a máscara progressivamente conforme o usuário digita:
-
Validação da máscara (opcional, além da validação dos DVs)
- Aceitar:
- string já formatada na forma
BB.BBB.BBB/BBBD-DD - ou string sem máscara, com 14 caracteres alfanuméricos
- string já formatada na forma
- Rejeitar:
- strings com caracteres inválidos (que não sejam letras ou dígitos, desconsiderando os separadores
.,/,-) - strings cuja forma formatada não respeite as posições dos separadores indicadas acima.
- strings com caracteres inválidos (que não sejam letras ou dígitos, desconsiderando os separadores
- Aceitar: