cnpjcpf.
Código · Java

Validar CNPJ em Java

Um método sem dependências que valida CNPJ pelo módulo 11numérico e alfanumérico no mesmo código. A conversão ASCII − 48 trata letra e dígito de forma uniforme; só os 2 verificadores continuam numéricos.

A função

Java
public final class Doc {
    private static int dv(String base, int[] w) {
        int s = 0;
        for (int i = 0; i < w.length; i++) s += (base.charAt(i) - 48) * w[i];
        int r = s % 11;
        return r < 2 ? 0 : 11 - r;
    }

    public static boolean isValidCnpj(String cnpj) {
        cnpj = cnpj.replaceAll("[./-]", "").toUpperCase();
        if (!cnpj.matches("[A-Z0-9]{12}\\d{2}")) return false;
        if (cnpj.matches("(.)\\1{13}")) return false; // repetidos
        int[] w1 = {5,4,3,2,9,8,7,6,5,4,3,2};
        int[] w2 = {6,5,4,3,2,9,8,7,6,5,4,3,2};
        int d1 = dv(cnpj.substring(0, 12), w1);
        int d2 = dv(cnpj.substring(0, 12) + d1, w2);
        return d1 == cnpj.charAt(12) - '0' && d2 == cnpj.charAt(13) - '0';
    }
}

O mesmo método valida os dois formatos: o numérico é um caso particular do alfanumérico. A base tem 12 posições (letras A–Z ou dígitos 0–9) e os 2 verificadores são sempre numéricos.

Por que ASCII − 48

No módulo 11 cada posição vira um número antes de multiplicar pelo peso. Para tratar letra e dígito de forma uniforme, converte-se o caractere pelo seu código ASCII menos 48: '0' vira 0, '9' vira 9 e 'A' vira 17 (segue até 'Z' = 42). É exatamente o que base.charAt(i) - 48 faz dentro de dv().

Os pesos vêm em duas listas (w1 para o 1º dígito, w2 para o 2º) e o resto da divisão por 11 define o verificador — r < 2 ? 0 : 11 - r. É o módulo 11 de sempre, só com a entrada normalizada.

Como usar

Java
Doc.isValidCnpj("12.ABC.345/01DE-35"); // true  (alfanumérico, exemplo SERPRO)
Doc.isValidCnpj("11.222.333/0001-81"); // true  (numérico)
Doc.isValidCnpj("11.222.333/0001-00"); // false
publicidade

Cuidados

  • Regex só valida formato. Um padrão como [A-Z0-9]{12}\d{2} confirma que são 12 posições alfanuméricas + 2 dígitos, mas não confere o verificador — quem faz isso é o método acima. Veja regex de CNPJ.
  • Sequências repetidas (00000000000000) passariam no módulo 11, por isso o método as descarta antes com cnpj.matches("(.)\\1{13}").
  • Normalize antes. O método força toUpperCase() e remove . / -; minúsculas e máscara são tratadas, mas guarde sempre os 14 caracteres limpos.
  • Válido ≠ existe. O método confirma a consistência matemática, não se o CNPJ foi emitido a uma empresa real. Para isso é outra coisa: CNPJ válido vs. CNPJ real.
  • Alfanumérico entra em jul/2026 (IN RFB nº 2.229/2024), só para novos registros. O código já está pronto para os dois formatos.

Continue

Perguntas frequentes

O mesmo método valida CNPJ numérico e alfanumérico?
Sim. A base de 12 caracteres aceita letras (A–Z) e dígitos (0–9) com a conversão caractere − 48; o numérico é caso particular. Os 2 dígitos verificadores continuam sempre numéricos.
Preciso normalizar antes de chamar?
O método já força toUpperCase() e remove . / - com replaceAll("[./-]", ""). Minúsculas e máscara são tratadas.
Validar é o mesmo que existir na Receita?
Não. O método confere a consistência matemática (módulo 11), não se o CNPJ foi emitido a uma empresa real.
Código em Java verificado com o exemplo oficial SERPRO (12ABC34501DE → DV 35). Algoritmo módulo 11 com conversão ASCII−48. Revisado em 06/2026.