Validar RENAVAM em C#

14 de novembro de 2013 7 comentários

Olá Pessoas!

“Faz um tempinho que não posto aqui no blog. Na medida do possível vou tentar postar com mais frequência.”

No dia 1º de abril deste ano, (não é mentira rsrs), houve uma mudança no Registro Nacional de Veículos Automotores, o RENAVAM, que passou a ter 11 dígitos.
Então criei uma classe que recebe um número de RENAVAM, com 9 ou 11 dígitos e retorna um booleano, indicando se o número é válido ou não.

Segue o código:

    public static class ValidarRENAVAM
    {
        public static bool isRENAVAM(string RENAVAM)
        {
            if (string.IsNullOrEmpty(RENAVAM.Trim())) return false;

            int[] d = new int[11];
            string sequencia = "3298765432";
            string SoNumero = Regex.Replace(RENAVAM, "[^0-9]", string.Empty);

            if (string.IsNullOrEmpty(SoNumero)) return false;

            //verificando se todos os numeros são iguais **************************
            if (new string(SoNumero[0], SoNumero.Length) == SoNumero) return false;
            SoNumero = Convert.ToInt64(SoNumero).ToString("00000000000");

            int v = 0;

            for (int i = 0; i < 11; i++)
                d[i] = Convert.ToInt32(SoNumero.Substring(i, 1));

            for (int i = 0; i < 10; i++)
                v += d[i] * Convert.ToInt32(sequencia.Substring(i, 1));

            v = (v * 10) % 11; v = (v != 10) ? v : 0;
            return (v == d[10]);
        }
    }

Quem quiser, poderá baixar um exemplo de uso da classe ValidarRENAVAM, clicando aqui.

Um forte abraço a todos,
Ivan Meirelles

Categorias:C#, Geral, Programação Tags:,

Exportar uma DataGridView para HTML em C#

7 de novembro de 2012 1 comentário

Olá pessoas!

Algumas vezes, trabalhando com desenvolvimento em WindowsForms, há a necessidade de imprimir uma DataGridView, exatamente como está sendo exibida.

Então criei uma classe para gerar um HTML com dados de uma DataGridView e abrir o HTML no navegar padrão instalado no windows. Segue o código:

public static class DataGridViewToHTML
{
	public static void ExibirHTML(DataGridView dgv)
	{
		string caminho = Path.Combine(Application.StartupPath, "relat.html");
		StreamWriter r = new System.IO.StreamWriter(caminho, false);

		Font fonte = dgv.ColumnHeadersDefaultCellStyle.Font;
		int tabSize = 0;
		foreach (DataGridViewColumn col in dgv.Columns)
			if (col.Visible) tabSize += col.Width;

		string[] conteudo = new string[dgv.Columns.Count];

		r.WriteLine("<html><head>");
		r.WriteLine("<meta http-equiv='Content-Type' "
			+ "content='text/html; charset=utf-8' />");
		r.WriteLine("<title>" + dgv.Name + "</title>");
		r.WriteLine("</head><body>");

		r.WriteLine("<div style='position:static'>");
		r.WriteLine("<table style='border-collapse: collapse; width:"
			+ tabSize.ToString() + "px'>");
		r.WriteLine("<tr>");

		foreach (DataGridViewColumn coluna in dgv.Columns)
		{
			if (coluna.Visible)
			{
				r.WriteLine("<td style='padding: 2px 2px 2px 2px; "
					+ "font-weight:bold; font-size:"
					+ Convert.ToInt32(fonte.Size + 3).ToString()
					+ "px; border-collapse: collapse; ' align='"
					+ coluna.InheritedStyle.Alignment.ToString().Substring(6, 
						coluna.InheritedStyle.Alignment.ToString().Length - 6)
					+ "' width='" + coluna.Width + "'>");
				r.WriteLine("<font face='" + fonte.Name + "'>");
				r.WriteLine(coluna.HeaderText.ToString());
				r.WriteLine("</font>");
				r.WriteLine("</td>");
			}
		}
		r.WriteLine("</tr>");
		if (dgv.Rows.Count > 0)
		{
			foreach (DataGridViewRow linha in dgv.Rows)
			{
				r.WriteLine("<tr>");
				foreach (DataGridViewCell celula in linha.Cells)
				{
					if (celula.Visible)
					{
						r.WriteLine("<td style='padding: 2px 2px 2px 2px; font-size:"
							+ Convert.ToInt32(fonte.Size + 3).ToString()
							+ "; border-collapse: collapse; ' align='"
							+ celula.InheritedStyle.Alignment.ToString().Substring(6,
								celula.InheritedStyle.Alignment.ToString().Length - 6)
							+ "' width='" + celula.Size.Width + "'>");
						r.Write("<font face='" + fonte.Name + "'>" 
							+ celula.FormattedValue.ToString() + "</font>");
						r.WriteLine("</td>");
					}
				}
				r.WriteLine("</tr>");
			}
		}
		r.WriteLine("</table></div></body></html>");
		r.Close();

		Process p = new Process();
		p.StartInfo = new ProcessStartInfo(caminho);
		p.StartInfo.UseShellExecute = true;
		p.Start();
	}
}

O código pode ser melhorado. Pode ainda acrescentar detalhes como um cabeçado ou roda-pé, para dar um sentido de relatório, ou ainda acrescentar cores. É, mas ai já é HTML.

Quem quiser, poderá baixar um exemplo de uso da classe DataGridViewToHTML, clicando aqui.

Um forte abraço a todos,
Ivan Meirelles

Escrever valores por extenso em C#

27 de outubro de 2012 21 comentários

Olá pessoal!

Trabalhando com automação comercial, em alguns momentos se faz necessária a impressão ou exibição de um valor monetário escrito por extenso. Por exemplo: R$ 140,32 = “cento e quarenta reais e trinta e dois centavos”. Sendo assim deixo aqui minha colaboração.

Abaixo segue uma classe que fiz em C# para escrever por extenso um valor qualquer.
Eu limitei o valor máximo em 999.999.999.999.999,99. Acho que é um valor razoável.

public class Converter
{
	// O método toExtenso recebe um valor do tipo decimal
	public static string toExtenso(decimal valor)
	{
		if (valor <= 0 | valor >= 1000000000000000)
			return "Valor não suportado pelo sistema.";
		else
		{
			string strValor = valor.ToString("000000000000000.00");
			string valor_por_extenso = string.Empty;

			for (int i = 0; i <= 15; i += 3)
			{
				valor_por_extenso += escreva_parte(Convert.ToDecimal(strValor.Substring(i, 3)));
				if (i == 0 & valor_por_extenso != string.Empty)
				{
					if (Convert.ToInt32(strValor.Substring(0, 3)) == 1)
						valor_por_extenso += " TRILHÃO" + ((Convert.ToDecimal(strValor.Substring(3, 12)) > 0) ? " E " : string.Empty);
					else if (Convert.ToInt32(strValor.Substring(0, 3)) > 1)
						valor_por_extenso += " TRILHÕES" + ((Convert.ToDecimal(strValor.Substring(3, 12)) > 0) ? " E " : string.Empty);
				}
				else if (i == 3 & valor_por_extenso != string.Empty)
				{
					if (Convert.ToInt32(strValor.Substring(3, 3)) == 1)
						valor_por_extenso += " BILHÃO" + ((Convert.ToDecimal(strValor.Substring(6, 9)) > 0) ? " E " : string.Empty);
					else if (Convert.ToInt32(strValor.Substring(3, 3)) > 1)
						valor_por_extenso += " BILHÕES" + ((Convert.ToDecimal(strValor.Substring(6, 9)) > 0) ? " E " : string.Empty);
				}
				else if (i == 6 & valor_por_extenso != string.Empty)
				{
					if (Convert.ToInt32(strValor.Substring(6, 3)) == 1)
						valor_por_extenso += " MILHÃO" + ((Convert.ToDecimal(strValor.Substring(9, 6)) > 0) ? " E " : string.Empty);
					else if (Convert.ToInt32(strValor.Substring(6, 3)) > 1)
						valor_por_extenso += " MILHÕES" + ((Convert.ToDecimal(strValor.Substring(9, 6)) > 0) ? " E " : string.Empty);
				}
				else if (i == 9 & valor_por_extenso != string.Empty)
					if (Convert.ToInt32(strValor.Substring(9, 3)) > 0)
						valor_por_extenso += " MIL" + ((Convert.ToDecimal(strValor.Substring(12, 3)) > 0) ? " E " : string.Empty);

				if (i == 12)
				{
					if (valor_por_extenso.Length > 8)
						if (valor_por_extenso.Substring(valor_por_extenso.Length - 6, 6) == "BILHÃO" | valor_por_extenso.Substring(valor_por_extenso.Length - 6, 6) == "MILHÃO")
							valor_por_extenso += " DE";
						else
							if (valor_por_extenso.Substring(valor_por_extenso.Length - 7, 7) == "BILHÕES" | valor_por_extenso.Substring(valor_por_extenso.Length - 7, 7) == "MILHÕES" | valor_por_extenso.Substring(valor_por_extenso.Length - 8, 7) == "TRILHÕES")
								valor_por_extenso += " DE";
							else
								if (valor_por_extenso.Substring(valor_por_extenso.Length - 8, 8) == "TRILHÕES")
									valor_por_extenso += " DE";

					if (Convert.ToInt64(strValor.Substring(0, 15)) == 1)
						valor_por_extenso += " REAL";
					else if (Convert.ToInt64(strValor.Substring(0, 15)) > 1)
						valor_por_extenso += " REAIS";

					if (Convert.ToInt32(strValor.Substring(16, 2)) > 0 && valor_por_extenso != string.Empty)
						valor_por_extenso += " E ";
				}

				if (i == 15)
					if (Convert.ToInt32(strValor.Substring(16, 2)) == 1)
						valor_por_extenso += " CENTAVO";
					else if (Convert.ToInt32(strValor.Substring(16, 2)) > 1)
						valor_por_extenso += " CENTAVOS";
			}
			return valor_por_extenso;
		}
	}

	static string escreva_parte(decimal valor)
	{
		if (valor <= 0)
			return string.Empty;
		else
		{
			string montagem = string.Empty;
			if (valor > 0 & valor < 1)
			{
				valor *= 100;
			}
			string strValor = valor.ToString("000");
			int a = Convert.ToInt32(strValor.Substring(0, 1));
			int b = Convert.ToInt32(strValor.Substring(1, 1));
			int c = Convert.ToInt32(strValor.Substring(2, 1));

			if (a == 1) montagem += (b + c == 0) ? "CEM" : "CENTO";
			else if (a == 2) montagem += "DUZENTOS";
			else if (a == 3) montagem += "TREZENTOS";
			else if (a == 4) montagem += "QUATROCENTOS";
			else if (a == 5) montagem += "QUINHENTOS";
			else if (a == 6) montagem += "SEISCENTOS";
			else if (a == 7) montagem += "SETECENTOS";
			else if (a == 8) montagem += "OITOCENTOS";
			else if (a == 9) montagem += "NOVECENTOS";

			if (b == 1)
			{
				if (c == 0) montagem += ((a > 0) ? " E " : string.Empty) + "DEZ";
				else if (c == 1) montagem += ((a > 0) ? " E " : string.Empty) + "ONZE";
				else if (c == 2) montagem += ((a > 0) ? " E " : string.Empty) + "DOZE";
				else if (c == 3) montagem += ((a > 0) ? " E " : string.Empty) + "TREZE";
				else if (c == 4) montagem += ((a > 0) ? " E " : string.Empty) + "QUATORZE";
				else if (c == 5) montagem += ((a > 0) ? " E " : string.Empty) + "QUINZE";
				else if (c == 6) montagem += ((a > 0) ? " E " : string.Empty) + "DEZESSEIS";
				else if (c == 7) montagem += ((a > 0) ? " E " : string.Empty) + "DEZESSETE";
				else if (c == 8) montagem += ((a > 0) ? " E " : string.Empty) + "DEZOITO";
				else if (c == 9) montagem += ((a > 0) ? " E " : string.Empty) + "DEZENOVE";
			}
			else if (b == 2) montagem += ((a > 0) ? " E " : string.Empty) + "VINTE";
			else if (b == 3) montagem += ((a > 0) ? " E " : string.Empty) + "TRINTA";
			else if (b == 4) montagem += ((a > 0) ? " E " : string.Empty) + "QUARENTA";
			else if (b == 5) montagem += ((a > 0) ? " E " : string.Empty) + "CINQUENTA";
			else if (b == 6) montagem += ((a > 0) ? " E " : string.Empty) + "SESSENTA";
			else if (b == 7) montagem += ((a > 0) ? " E " : string.Empty) + "SETENTA";
			else if (b == 8) montagem += ((a > 0) ? " E " : string.Empty) + "OITENTA";
			else if (b == 9) montagem += ((a > 0) ? " E " : string.Empty) + "NOVENTA";

			if (strValor.Substring(1, 1) != "1" & c != 0 & montagem != string.Empty) montagem += " E ";

			if (strValor.Substring(1, 1) != "1")
				if (c == 1) montagem += "UM";
				else if (c == 2) montagem += "DOIS";
				else if (c == 3) montagem += "TRÊS";
				else if (c == 4) montagem += "QUATRO";
				else if (c == 5) montagem += "CINCO";
				else if (c == 6) montagem += "SEIS";
				else if (c == 7) montagem += "SETE";
				else if (c == 8) montagem += "OITO";
				else if (c == 9) montagem += "NOVE";

			return montagem;
		}
	}
}

O código é extenso, porém, muito útil!
Quem quiser, poderá baixar um exemplo de uso da classe Converter, clicando aqui.

Um abraço a todos.
Ivan Meirelles.

O que quer dizer “Validar CPF ou CNPJ” ?

27 de outubro de 2012 Deixe um comentário

Olá pessoal!

Em um post que fiz recentemente “Validar CPF e/ou CNPJ em C#” demonstrei como construir uma classe em C# para tal finalidade.

Algumas pessoas me questionaram: “o que é validar CPF ou CNPJ?”.

Se você possui um CPF, já deve ter notado que o mesmo é composto por 11 dígitos numéricos e os últimos dois dígitos são separados dos demais por um hífen (ou tracinho como preferir). Esses dois últimos dígitos são chamados dígitos verificadores, o que significa que são utilizados para verificar algo, ou seja, se o CPF é válido.

Os dois últimos dígitos são obtidos através de um cálculo aplicado sobre os nove primeiros dígitos, sendo assim, quando alguém me passar um CPF, eu poderei realizar um cálculo com os nove primeiros dígitos e verificar se o resultado é igual aos dois últimos dígitos que a pessoa me passou. Se eles forem diferentes, poderei deduzir que a pessoa errou ao me passar o CPF ou está tentando me enganar.

Vamos para um exemplo prático de como calcular os dígitos verificadores.

Suponhamos que alguém está para fazer um crediário em uma empresa. E ao realizar seu cadastro, passou o seguinte CPF: 123.456.789-09

Os dígitos verificadores informados foram: “0” e “9”

Vamos aplicar uma fórmula sobre os outros dígitos do CPF:

O primeiro dígito, multiplicamos por 10, ou seja: 1 x 10 = 10;
O segundo dígito, multiplicamos por 9, ou seja: 2 x 9 = 18;
O terceiro dígito, multiplicamos por 8, ou seja: 3 x 8 = 24;
O quarto dígito, multiplicamos por 7, ou seja: 4 x 7 = 28;
O quinto dígito, multiplicamos por 6, ou seja: 5 x 6 = 30;
O sexto dígito, multiplicamos por 5, ou seja: 6 x 5 = 30;
O sétimo dígito, multiplicamos por 4, ou seja: 7 x 4 = 28;
O oitavo dígito, multiplicamos por 3, ou seja: 8 x 3 = 24;
O nono dígito, multiplicamos por 2, ou seja: 9 x 2 = 18;

Agora basta somar todos os resultados e multiplicar por 10: (10 + 18 + 24 + 28 + 30 + 30 + 28 + 24 + 18) x 10 = 2100;

Agora vamos dividir esse resultado por 11: 2100 / 11 = 190,9091…

Mas o que nos interessa não é o resultado da divisão e sim o resto da divisão, ou seja, se dividirmos 2100 por 11, teremos como resultado 190 e resto 10.

Esse resto é o primeiro dígito verificador do CPF, porém, sempre que o resto for 10 assumiremos como dígito verificador o valor zero. Sendo assim, temos como resultado do nosso cálculo o valor “0” para o primeiro dígito verificador, que é exatamente o mesmo informado pela pessoa.

Já que o primeiro dígito verificador está correto, vamos calcular o segundo dígito.

Agora além dos nove primeiros dígitos do CPF, vamos acrescentar ao cálculo o primeiro dígito verificador.

O procedimento é praticamente o mesmo. A única diferença é que vamos iniciar a multiplicação dos dígitos por 11:

O primeiro dígito, multiplicamos por 11, ou seja: 1 x 11 = 11;
O segundo dígito, multiplicamos por 10, ou seja: 2 x 10 = 20;
O terceiro dígito, multiplicamos por 9, ou seja: 3 x 9 = 27;
O quarto dígito, multiplicamos por 8, ou seja: 4 x 8 = 32;
O quinto dígito, multiplicamos por 7, ou seja: 5 x 7 = 35;
O sexto dígito, multiplicamos por 6, ou seja: 6 x 6 = 36;
O sétimo dígito, multiplicamos por 5, ou seja: 7 x 5 = 35;
O oitavo dígito, multiplicamos por 4, ou seja: 8 x 4 = 32;
O nono dígito, multiplicamos por 3, ou seja: 9 x 3 = 27;
O primeiro dígito verificador, multiplicamos por 2, ou seja: 0 x 2 = 0;

Agora basta somar todos os resultados e multiplicar por 10 à (11 + 20 + 27 + 32 + 35 + 36 + 35 + 32 + 27 + 0) x 10 = 2550;

E da mesma forma que fizemos como o primeiro dígito verificador, iremos buscar o resto divisão de 2550 por 11, ou seja: 2550 / 11 = 231,8182…

Lembrando que nos interessa é o resto da divisão: 2550 / 11 = 231 e resta 9.

Então, “9” é o último digito verificador desse CPF.

Assim concluímos que o CPF 123.456.789-09 é um CPF válido pois seus dígitos verificadores “0” e “9” são exatamente iguais aos que encontramos através do cálculo realizado.

Para realizar o cálculo do dígito verificador do CNPJ, segue-se o mesmo processo, porém iniciamos a multiplicação do primeiro dígito por 5, o segundo por 4, o terceiro por 3, o quarto por 2, o quinto por 9 e depois vamos reduzindo até chegar ao décimo-segundo, que multiplicamos por 2. O restante do processo é o mesmo: soma-se tudo, multiplica-se por 10 e pega-se o resto da divisão por 11.

Já para o segundo dígito verificador do CNPJ, iniciamos por processo multiplicando o primeiro dígito por 6.

Ufa!, extenso porém, simples!

Um forte abraço a todos.
Ivan Meirelles.

Validar CPF e/ou CNPJ em C#

26 de outubro de 2012 11 comentários

Olá a todos!

Aqui apresento o meu primeiro “post útil” para quem está começando na linguagem C#.
Uma das coisas que os alunos iniciantes em desenvolvimento de sistemas mais perguntam em salas de aula é “Como validar CPF e CNPJ?”.

Então deixo aqui uma classe que fiz para validar CPF e/ou CNPJ em C#.

using System.Text.RegularExpressions;
public static class Verificar
{
	// o metodo isCPFCNPJ recebe dois parâmetros:
	// uma string contendo o cpf ou cnpj a ser validado
	// e um valor do tipo boolean, indicando se o método irá
	// considerar como válido um cpf ou cnpj em branco.
	// o retorno do método também é do tipo boolean:
	// (true = cpf ou cnpj válido; false = cpf ou cnpj inválido)
	public static bool isCPFCNPJ(string cpfcnpj, bool vazio)
	{
		if (string.IsNullOrEmpty(cpfcnpj))
			return vazio;
		else
		{
			int[] d = new int[14];
			int[] v = new int[2];
			int j, i, soma;
			string Sequencia, SoNumero;

			SoNumero = Regex.Replace(cpfcnpj, "[^0-9]", string.Empty);

			//verificando se todos os numeros são iguais
			if (new string(SoNumero[0], SoNumero.Length) == SoNumero) return false;

			// se a quantidade de dígitos numérios for igual a 11
			// iremos verificar como CPF
			if (SoNumero.Length == 11)
			{
				for (i = 0; i <= 10; i++) d[i] = Convert.ToInt32(SoNumero.Substring(i, 1));
				for (i = 0; i <= 1; i++)
				{
					soma = 0;
					for (j = 0; j <= 8 + i; j++) soma += d[j] * (10 + i - j);

					v[i] = (soma * 10) % 11;
					if (v[i] == 10) v[i] = 0;
				}
				return (v[0] == d[9] & v[1] == d[10]);
			}
			// se a quantidade de dígitos numérios for igual a 14
			// iremos verificar como CNPJ
			else if (SoNumero.Length == 14)
			{
				Sequencia = "6543298765432";
				for (i = 0; i <= 13; i++) d[i] = Convert.ToInt32(SoNumero.Substring(i, 1));
				for (i = 0; i <= 1; i++)
				{
					soma = 0;
					for (j = 0; j <= 11 + i; j++)
						soma += d[j] * Convert.ToInt32(Sequencia.Substring(j + 1 - i, 1));

					v[i] = (soma * 10) % 11;
					if (v[i] == 10) v[i] = 0;
				}
				return (v[0] == d[12] & v[1] == d[13]);
			}
			// CPF ou CNPJ inválido se
			// a quantidade de dígitos numérios for diferente de 11 e 14
			else return false;
		}
	}
}

Simples não é?

Quem quiser, poderá baixar um exemplo de uso da classe que acabamos de criar, clicando aqui.

No próximo post irei demonstrar passo-a-passo como construir uma ferramenta herdada de um TextBox que faz a validação do CPF ou CNPJ.

Um abraço a todos e bons estudos.
Ivan Meirelles.

Só por curiosidade!

24 de outubro de 2012 Deixe um comentário
Categorias:Geral

Bem vindos!

24 de outubro de 2012 Deixe um comentário

Este blog foi criado com intuito de publicar artigos e/ou tutoriais sobre programação em geral.

Trabalho com a linguagem C# no desenvolvimento de sistemas para Automação Comercial, utilizando banco de dados SQL Server e Firebird.

Caso alguém queira postar um tutorial ou artigo sobre qualquer assunto relacionado ao desenvolvimento de sistemas, fique a vontade para me contactar por e-mail: igmeirelles@gmail.com

Vamos tentar fazer deste, um lugar onde podemos aprender e repassar conhecimentos.

Um abraço a todos.

Ivan Meirelles.

Categorias:Geral
Ivan Guimarães Meirelles

Analista Desenvolvedor

Vida de Suporte

Analista Desenvolvedor

Vida de Programador

O maior site de tirinhas de humor focado para programadores e profissionais de T.I. baseado em histórias reais enviadas pelos leitores.

Analista Desenvolvedor

%d blogueiros gostam disto: