Grupos exclusivos de desconto no WhatsApp — Faca parte agora! Participar

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.

Como validar CNPJ alfanumérico em C#/.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á:

C#
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:

C#
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

Resumo rápido
  • 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 via ModelState.
  • 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.

CNPJTipoEsperado
12.ABC.345/01DE-35Alfanumérico (filial)VÁLIDO
XP.TO1.234/0001-20Alfanumérico (matriz)VÁLIDO
9F.8E7.D6C/0001-36Alfanumérico (matriz)VÁLIDO
A1.B2C.3D4/E5F6-68Alfanumérico (filial)VÁLIDO
ZZ.ZZ0.001/AAAA-41AlfanuméricoVÁLIDO
11.222.333/0001-81Numérico clássicoVÁLIDO
12.ABC.345/01DE-34DV 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.

Assistente PP
Assistente PP
Online agora
Powered by Primeira Solução