Como validar CNPJ alfanumérico em C#/.NET
Classe estática pronta em C# para validar o novo CNPJ alfanumérico e calcular os dígitos verificadores, com exemplo de ValidationAttribute para ASP.NET.
Aprenda a validar CNPJ alfanumérico em C#/.NET com uma classe estática pronta para copiar, que calcula os dígitos verificadores e aceita tanto os novos CNPJs com letras quanto os numéricos de hoje.
O que muda no CNPJ alfanumérico
A partir de julho de 2026, a Receita Federal começa a emitir o novo CNPJ alfanumérico (Instrução Normativa RFB nº 2.229/2024). Ele mantém as 14 posições e a mesma máscara XX.XXX.XXX/XXXX-DD, mas as 12 primeiras posições passam a aceitar letras maiúsculas A–Z além dos dígitos 0–9. Os dois dígitos verificadores (posições 13 e 14) continuam numéricos, e os CNPJs numéricos atuais permanecem válidos — seu sistema precisa aceitar os dois formatos. Para a visão completa do impacto, veja o guia de implementação do CNPJ alfanumérico.
Validando CNPJ alfanumérico em C#
A classe estática abaixo concentra tudo: normalização da entrada, cálculo dos dois dígitos verificadores e a validação final. Ela usa os pesos do módulo 11 (5,4,3,2,9,8,7,6,5,4,3,2 para o primeiro DV e 6,5,4,3,2,9,8,7,6,5,4,3,2 para o segundo) e a regra resto = soma % 11; dv = resto < 2 ? 0 : 11 - resto. Copie como está:
using System.Text.RegularExpressions;
public static class CnpjAlfanumerico
{
private static readonly int[] Peso1 = { 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
private static readonly int[] Peso2 = { 6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
private static string Normalizar(string s) =>
Regex.Replace((s ?? "").ToUpper(), "[^A-Z0-9]", "");
private static int Digito(string baseStr, int[] pesos)
{
int soma = 0;
for (int i = 0; i < baseStr.Length; i++)
soma += (baseStr[i] - 48) * pesos[i];
int resto = soma % 11;
return resto < 2 ? 0 : 11 - resto;
}
public static string CalcularDV(string base12)
{
int d1 = Digito(base12, Peso1);
int d2 = Digito(base12 + d1, Peso2);
return $"{d1}{d2}";
}
public static bool Validar(string cnpj)
{
var c = Normalizar(cnpj);
if (!Regex.IsMatch(c, "^[A-Z0-9]{12}[0-9]{2}$")) return false;
if (Regex.IsMatch(c.Substring(0, 12), "^0{12}$")) return false;
return CalcularDV(c.Substring(0, 12)) == c.Substring(12);
}
}O método Normalizar deixa tudo em maiúsculas e remove a máscara, então Validar("12.ABC.345/01DE-35") e Validar("12abc34501de35") retornam o mesmo resultado. A expressão regular garante que apenas as 12 primeiras posições aceitem letras — os dois últimos caracteres precisam ser dígitos.
Calculando os dígitos verificadores
O método CalcularDV recebe as 12 primeiras posições (a base) e devolve os dois dígitos como string. Internamente, Digito percorre a base somando (char - 48) * peso; para o segundo dígito, a base é concatenada com o primeiro DV já calculado. É a mesma mecânica do CNPJ numérico — você não precisa de tabelas de conversão nem de switch por letra, porque o char - 48 faz o trabalho. Por exemplo, CalcularDV("12ABC34501DE") retorna "35".
Usando em ASP.NET com um ValidationAttribute
Em aplicações ASP.NET (MVC ou Web API), o caminho mais limpo é encapsular a regra em um atributo de validação customizado que chama o método estático. Assim a validação roda no model binding, junto com o resto do ModelState:
using System.ComponentModel.DataAnnotations;
public sealed class CnpjAlfanumericoAttribute : ValidationAttribute
{
public override bool IsValid(object? value)
{
var texto = value as string;
// Deixe [Required] cuidar de obrigatoriedade; aqui, vazio passa.
if (string.IsNullOrWhiteSpace(texto)) return true;
return CnpjAlfanumerico.Validar(texto);
}
}
public class EmpresaModel
{
[Required]
[CnpjAlfanumerico(ErrorMessage = "CNPJ inválido.")]
public string Cnpj { get; set; } = "";
}Como testar
- Chame
CnpjAlfanumerico.Validar(entrada)— ele já normaliza máscara e caixa. - Use
CnpjAlfanumerico.CalcularDV(base12)para gerar os dois dígitos a partir das 12 primeiras posições. - Plugue o
[CnpjAlfanumerico]nos seus models ASP.NET para validar viaModelState. - Rode os vetores abaixo num teste de unidade (xUnit/NUnit) antes de ir para produção.
Valide cada caso contra a tabela. Para gerar dados de teste em massa, use o nosso gerador de CNPJ alfanumérico e confira qualquer número no validador de CNPJ alfanumérico.
| CNPJ | Tipo | Esperado |
|---|---|---|
12.ABC.345/01DE-35 | Alfanumérico (filial) | VÁLIDO |
XP.TO1.234/0001-20 | Alfanumérico (matriz) | VÁLIDO |
9F.8E7.D6C/0001-36 | Alfanumérico (matriz) | VÁLIDO |
A1.B2C.3D4/E5F6-68 | Alfanumérico (filial) | VÁLIDO |
ZZ.ZZ0.001/AAAA-41 | Alfanumérico | VÁLIDO |
11.222.333/0001-81 | Numérico clássico | VÁLIDO |
12.ABC.345/01DE-34 | DV errado (era 35) | INVÁLIDO |
Perguntas frequentes
O código também aceita CNPJ numérico antigo?
Sim. O mesmo algoritmo vale para os dois formatos, porque para os dígitos 0–9 o cálculo char - 48 devolve o próprio valor numérico. Por isso 11.222.333/0001-81 é validado normalmente.
Preciso de uma biblioteca externa para validar em C#?
Não. A classe estática usa apenas System.Text.RegularExpressions, que já vem na BCL do .NET. Não há dependência de NuGet, então ela funciona igual em .NET Framework, .NET Core e .NET 6/8+.
Onde colocar a validação numa API ASP.NET?
Use o CnpjAlfanumericoAttribute sobre a propriedade do model. No controller, basta checar ModelState.IsValid — o atributo chama CnpjAlfanumerico.Validar automaticamente durante o model binding, antes de a action executar.
Como ficam os pesos do módulo 11?
Os pesos são os mesmos do CNPJ atual: 5,4,3,2,9,8,7,6,5,4,3,2 para o primeiro dígito e 6,5,4,3,2,9,8,7,6,5,4,3,2 para o segundo. O que muda é só o valor de cada caractere da base.
Implementando em outra stack? Veja também como validar CNPJ alfanumérico em Java e como validar CNPJ alfanumérico em PHP.
Fontes: Receita Federal (IN RFB 2.229/2024) e nota técnica do Serpro sobre o CNPJ alfanumérico.
Ofertas em destaque
Ver todas →
Shopee
-56%
Calça Pantalona Lanzinha Feminina Cintura Alta Com Elastico De e Bolso Outono / Inverno Promoção
Amazon
-14%
Lenços Umedecidos Huggies Rosto e Corpo Limpeza 4 x 48 Un
Shopee
-60%
Brow Rise Gel Para Sobrancelhas By Ruby Rose Linha Rosa HB-E2503 Hot Sale
Amazon
-27%
Hellmann's Maionese Light 500g
Amazon
-93%
Tramontina Ducha Elétrica 3 Temperaturas 5500 W 127 V Chuveiro Branco
Mercado Livre
-20%
Malbec Pure Gold O Boticário Desodorante Colônia Perfume Masculino Original 100ml
Mercado Livre
Perfume Lattafa Bade'e Al Oud For Glory Edp Spray 100 Ml
Mercado Livre
Jaqueta Masc. Sarja Capuz Broken Rules 510075 Preto M Lisa
Mercado Livre