cnpjcpf.
Código · C#

Validar CNPJ em C#

Um só método valida o CNPJ numérico e o novo alfanumérico: a conversão ASCII − 48 trata letra e dígito de forma uniforme; só os 2 verificadores continuam numéricos.

O método

Um só método valida o CNPJ numérico e o alfanumérico. O segredo é que cada caractere entra no módulo 11 como c - '0' (ou seja, ASCII − 48): assim '0'..'9' viram 0..9 (retrocompatível) e 'A'..'Z' viram 17..42.

C#
using System.Text.RegularExpressions;

public static class Doc {
    static int Dv(string baseStr, int[] w) {
        int s = 0;
        for (int i = 0; i < w.Length; i++) s += (baseStr[i] - 48) * w[i];
        int r = s % 11;
        return r < 2 ? 0 : 11 - r;
    }

    public static bool IsValidCnpj(string cnpj) {
        cnpj = Regex.Replace(cnpj, "[./-]", "").ToUpper();
        if (!Regex.IsMatch(cnpj, @"^[A-Z0-9]{12}\d{2}$")) return false;
        if (Regex.IsMatch(cnpj, @"^(.)\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[..12], w1), d2 = Dv(cnpj[..12] + d1, w2);
        return d1 == cnpj[12] - '0' && d2 == cnpj[13] - '0';
    }
}

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

O mesmo código 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. Os pesos (w1 para o 1º dígito, w2 para o 2º) são os mesmos do numérico — só a conversão do caractere muda.

Por que o exemplo SERPRO confere

A base oficial 12ABC34501DE produz DV 35: no 1º dígito a soma dá 459 (resto 8 → 11 - 8 = 3) e no 2º a soma dá 424 (resto 6 → 11 - 6 = 5). O método acima reproduz exatamente isso. Detalhe do cálculo em calcular o dígito verificador alfanumérico.

publicidade

Cuidados

  • Só maiúsculas. O alfanumérico não aceita minúsculas — por isso o método faz .ToUpper() antes de validar.
  • Os DV são sempre numéricos. A regex exige \d{2} no fim: letra nos dois últimos é inválido.
  • Sequências repetidas (00000000000000) passariam no módulo 11, por isso o método as descarta antes com ^(.)\1{13}$.
  • No banco, use texto. Colunas numéricas (bigint) quebram com letras — guarde em char(14)/varchar.
  • Válido ≠ existe. O método confirma a matemática, não se a empresa está cadastrada na Receita. 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

Código em C# verificado, inclusive contra o exemplo oficial do SERPRO (12ABC34501DE → DV 35). Algoritmo módulo 11 com conversão ASCII−48. Revisado em 06/2026.