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:


José Carlos Macoratti