C #
- Validando CNPJ , CPF e PIS
Eu já tratei da validação do CNPJ , CPF e PIS usando o VB .NET agora é a vez do C-Sharp.
Na prática os algoritmos são o mesmo o que muda é a maneira de implementar onde podemos usar ou não determinados recursos de cada linguagem.
Os códigos não são de minha autoria os encontrei na web em diversas buscas feitas e realizei pequenos ajustes.
Se você deseja conhecer como é o algoritmo usado para cada caso clique no links a seguir:
|
Atenção: TEXTO EXTRAÍDO DO SITE DE CNPJ DA RFB Até o ano de 1993, o número básico era composto de sete (7) dígitos que identificavam a empresa e o oitavo (8) dígito era um dígito verificador; como a quantidade de empresas cadastradas superou a unidade de milhão e não se optou por um recadastramento, o oitavo dígito deixou de ser um dígito verificador, o que permitiu um aumento de 90 milhões de números. Por este motivo NÃO se deve validar o CNPJ básico pelo cálculo do 8º dígito, considerando-o verificador. |
Criando o Projeto C# e as classes para validação
Abra o Visual C# 2010 Express Edition e crie um novo projeto do tipo Class LIbrary com o nome Validacao;
Remova o arquivo Class1.cs criado a seguir no menu Project clique em Add Class e informe o nome ValidaCNPJ.cs;
Repita o procedimento criando mais duas classes : ValidaCPF.cs e ValidaPis.cs
A seguir no menu File -> Add -> New Project selecione o template Windows Forms Application e informe o nome ValidarCNPJ_CPF_PIS e clique em ok;
Neste momento teremos uma solução chamada Validacao e dois projetos conforme mostra a figura abaixo:
![]() |
Vamos agora definir o código de cada uma das classes no projeto Validacao.
1- Código da classe ValidaCNPJ - O método IsCnpj retorna True para um CNPJ válido e False para um CNPJ inválido;
using System; namespace Validacao
{
/// <summary>
/// Realiza a validação do CNPJ
/// </summary>
public static class ValidaCNPJ
{
public static bool IsCnpj(string cnpj)
{
int[] multiplicador1 = new int[12] {5,4,3,2,9,8,7,6,5,4,3,2};
int[] multiplicador2 = new int[13] {6,5,4,3,2,9,8,7,6,5,4,3,2};
int soma;
int resto;
string digito;
string tempCnpj;
cnpj = cnpj.Trim();
cnpj = cnpj.Replace(".", "").Replace("-", "").Replace("/", "");
if (cnpj.Length != 14) return false; tempCnpj = cnpj.Substring(0, 12); soma = 0; for(int i=0; i<12; i++) soma += int.Parse(tempCnpj[i].ToString()) * multiplicador1[i]; resto = (soma % 11); if ( resto < 2) resto = 0; else resto = 11 - resto; digito = resto.ToString(); tempCnpj = tempCnpj + digito; soma = 0; for (int i = 0; i < 13; i++) soma += int.Parse(tempCnpj[i].ToString()) * multiplicador2[i]; resto = (soma % 11); if (resto < 2) resto = 0; else resto = 11 - resto; digito = digito + resto.ToString(); return cnpj.EndsWith(digito); } } } |
2- Código da classe ValidaCPF - O método IsCpf retorna True para um CPF válido e False para um CPF inválido;
using System; namespace Validacao
{
/// <summary>
/// Realiza a validação do CPF
/// </summary>
public static class ValidaCPF
{
public static bool IsCpf(string cpf)
{
int[] multiplicador1 = new int[9] { 10, 9, 8, 7, 6, 5, 4, 3, 2 };
int[] multiplicador2 = new int[10] { 11, 10, 9, 8, 7, 6, 5, 4, 3, 2 };
string tempCpf;
string digito;
int soma;
int resto;
cpf = cpf.Trim();
cpf = cpf.Replace(".", "").Replace("-", "");
if (cpf.Length != 11) return false; tempCpf = cpf.Substring(0, 9); soma = 0; for(int i=0; i<9; i++) soma += int.Parse(tempCpf[i].ToString()) * multiplicador1[i]; resto = soma % 11; if ( resto < 2 ) resto = 0; else resto = 11 - resto; digito = resto.ToString(); tempCpf = tempCpf + digito; soma = 0; for(int i=0; i<10; i++) soma += int.Parse(tempCpf[i].ToString()) * multiplicador2[i]; resto = soma % 11; if (resto < 2) resto = 0; else resto = 11 - resto; digito = digito + resto.ToString(); return cpf.EndsWith(digito); } } } |
3- Código da classe ValidaPis - O método IsPis retorna True para um PIS válido e False para um PIS inválido;
using System; namespace Validacao
{
/// <summary>
/// Realiza a validação do número PIS
/// </summary>
public static class ValidaPis
{
public static bool IsPis(string pis)
{
int[] multiplicador = new int[10] { 3,2,9,8,7,6,5,4,3,2 };
int soma;
int resto;
if (pis.Trim().Length != 11)
return false;
pis = pis.Trim();
pis = pis.Replace("-", "").Replace(".", "").PadLeft(11, '0');
soma = 0; for (int i = 0; i < 10; i++) soma += int.Parse(pis[i].ToString()) * multiplicador[i]; resto = soma % 11; if ( resto < 2 ) resto = 0; else resto = 11 - resto; return pis.EndsWith(resto.ToString()); } } } |
Os métodos são estáticos e portanto são métodos de classe e não de instância.
Definindo a interface para validação
No formulário padrão form1.cs do projeto ValidarCNPJ_CPF_PIS vamos usar os seguintes controles:
Conforme o leiaute da figura abaixo:
![]() |
A seguir defina o código do formulário
using System; using System.Windows.Forms; namespace ValidarCNPJ_CPF_PIS
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string mensagem = "";
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnValidar_Click(object sender, EventArgs e)
{
string valor = maskValor.Text;
if (rdb_cnpj.Checked)
{
if (Validacao.ValidaCNPJ.IsCnpj(valor))
{
mensagem = "O número é um CNPJ Válido !";
}
else
{
mensagem = "O número é um CNPJ Inválido !";
}
}
else if (rdb_cpf.Checked)
{
if (Validacao.ValidaCPF.IsCpf(valor))
{
mensagem = "O número é um CPF Válido !";
}
else
{
mensagem = "O número é um CPF Inválido !";
}
}
else if (rdb_pis.Checked)
{
if (Validacao.ValidaPis.IsPis(valor))
{
mensagem = "O número é um PIS Válido !";
}
else
{
mensagem = "O número é um PIS inválido !";
}
}
else
{
mensagem = "Informe o número e o seu tipo para validação !";
}
MessageBox.Show(mensagem, "Validação");
}
private void rdb_cnpj_CheckedChanged(object sender, EventArgs e)
{
maskValor.Text = "";
maskValor.Mask = "00,000,000/0000-00";
maskValor.MaskInputRejected += new MaskInputRejectedEventHandler(maskValor_MaskInputRejected);
}
private void rdb_cpf_CheckedChanged(object sender, EventArgs e)
{
maskValor.Text = "";
maskValor.Mask = "000,000,000-00";
maskValor.MaskInputRejected += new MaskInputRejectedEventHandler(maskValor_MaskInputRejected);
}
private void rdb_pis_CheckedChanged(object sender, EventArgs e)
{
maskValor.Text = "";
maskValor.Mask = "0000000000-0";
maskValor.MaskInputRejected += new MaskInputRejectedEventHandler(maskValor_MaskInputRejected);
}
void maskValor_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
{
toolTip1.ToolTipTitle = "Número informado inválido";
toolTip1.Show("Somente digitos de (0-9) são permitidos.", maskValor, maskValor.Location, 5000);
}
}
}
|
O código acima é bem simples; nele estamos definindo o código para o evento CheckedChanged dos controles radiobuttons onde definimos a máscara usada pelo respectivo formato selecionado e o evento MaskInputRejected que ocorre quando o usuário do entrada ou caractere atribuído não corresponde ao elemento de formato correspondente da máscara de entrada.
No evento MaskInputRejected estamos exibindo uma Tooltip informando que a entrada do usuário não é valida.
Executando o projeto e efetuando uma validação teremos:
![]() |
A implementação é bem simples, eu diria até ingênua , e é claro que existem muitas outras possibilidades, essa é apenas uma das mais simples.
Pegue o projeto completo aqui:
ValidacaoCNPJCPFPIS.zip
"Portanto agora nenhuma condenação há para os que estão em Cristo Jesus, que não andam segundo a carne, mas segundo o espírito." Romanos 8:1
Referências: