A classe .Net definitiva para CNPJ e CPF

CNPJ e CPF são estruturas onipresentes em qualquer sistema que rode no Brasil. Mesmo um Sistema de Risco de Mercado, como o nosso RiskSystem, não escapa da necessidade de guardar esses números e usá-los para buscas: fundos de investimento, custodiantes, administradores são todos identificados em múltiplos sistemas pelo CNPJ.

Nosso sistema foi inicialmente concebido para ter um caráter “internacional”, isto é, rodar sem problemas em qualquer local, mesmo os locais onde não existe o CNPJ ou o CPF, por isso só recentemente demos mais atenção a esse pequeno pedaço de informação, útil ao integrar o sistema com outros, como de Sistemas de Risco de Crédito ou Sistemas de Compliance.

Em termos de banco de dados CNPJ e CPF cabem bem num bigint (mas não num int!). Em termos de estruturas de dados um long serviria, mas preferimos algo mais definitivo, algo que encapsulasse esse número, que garantisse a correção, que facilitasse a visualização para o usuário final e a captura de valores digitados por este mesmo usuário. Procuramos uma classe ou estrutura pronta, disponível para uso, que tivesse o necessário. Não achamos, embora haja muita informação sobre como validar CNPJ e CPF.

Então decidimos por fazer a nossa versão: Optamos por uma estrutura (Ok, é uma estrutura e não uma classe, mas por um bom motivo) de apenas 8 bytes, imutável (como é desejável), corretamente serializável em binário e XML (uma necessidade nossa devido ao SOAP que usamos entre as camadas de serviço e interface), que fosse sempre garantidamente correta (a instância sempre é valida). Ela tem tudo o que desejamos, e é rápida, muito rápida, capaz de validar mais de 1 milhão de CNPJs ou CPFs em 1s.

E vamos compartilhar! Verdade que são apenas CNPJ e CPF, mas é um começo! Winking smile

No prático GitHub pode-se copiar o projeto do Visual Studio 2012 contento as estruturas de CNPJ e CPF. A maior parte do código é dedicada a implementar as interfaces que queriamos para serialização, comparação e formatação. O núcleo, em si, é apenas a função que computa o valor dos digitos de verificação. A estutura tem o mesmo cheiro que, por exemplo, a estrutura Guid, mesmo modo de uso, mesma funcionalidade.

Por exemplo, lendo o CNPJ de um formulário:

Cnpj goodCnpj;
if (!Cnpj.TryParse(strCnpj, out goodCnpj))
{
    // Não é um CNPJ!
}
// É um CNPJ correto.

O uso é livre, a licença MIT é extremamente liberal, mas não nos responsabilizamos por problemas que você venha a ter caso use esse código. Ainda assim, caso encontre algum problema, gostariamos de saber.

Enjoy!

Atualização

Este artigo foi atualizado em 2013-08-30 para apontar para o código, atualizado para o Visual Studio 2012, em nosso GitHub. Também trocamos a licença de uso do código para MIT.

Share