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.
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"); // falseO 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.
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 emchar(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.