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: