VB.NET - Convertendo datas para extenso
Ora, ora, então você quer converter datas para extenso !!!
Seria algo assim :
Você informa a data no formato dd/mm/aaaa Ex: 22/04/2014
E obtém o seguinte resultado: Terça-feira, Vinte e dois de Abril de Dois Mil e quatorze.
Pois bem, essa é uma tarefa simples para a linguagem VB .NET ou C#, como queiram...
Vamos então arregaçar as mangas e criar um programa usando a linguagem VB .NET que realiza essa tarefa.
Recursos Usados
Criando projeto no Visual Studio
Abra o VS Express 2012 for Windows Desktop e clique em New Project;
Selecione a linguagem Visual Basic e o template Windows Forms Application;
Informe o nome DataExtenso e clique no botão OK;
No formulário form1.vb inclua a partir da ToolBox os seguintes controles :
Disponha os controles no formulário conforme o leiaute abaixo:
Vamos declarar no formulário form1.vb o namespace System.Globalization.
O namespace System.Globalization contém classes que definem informações relacionadas à cultura, incluindo idioma, país/região, os calendários em uso, os padrões de formatação para datas, moeda e números e a classificação do pedido para seqüências de caracteres. Essas classes são úteis para escrever aplicativos (internacionalizados) globalizados.
Classes como StringInfo e TextInfo fornecem funcionalidades de globalização avançados, incluindo suporte substituto e processamento de elemento de texto.
Agora vamos usar o evento KeyPress das caixas de texto txtDia, txtMes e txtAno para permitir somente a entrada de valores numéricos. Para isso definimos o código a seguir no evento KeyPress desses controles:
Private Sub txtDia_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtDia.KeyPress
If Not Char.IsNumber(e.KeyChar) And Not e.KeyChar = vbBack Then
e.Handled = True
End If
End Sub
Private Sub txtMes_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMes.KeyPress
If Not Char.IsNumber(e.KeyChar) Then
e.Handled = True
End If
End Sub
Private Sub txtAno_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtAno.KeyPress
If Not Char.IsNumber(e.KeyChar) And Not e.KeyChar = vbBack Then
e.Handled = True
End If
End Sub
|
Vamos também usar o evento KeyPress do formulário form1.vb para enviar a tecla ENTER quando a tecla TAB for pressionada. Para isso temos que definir a propriedade KeyPreview do formulário form1.vb como igual a True e definir o código abaixo no evento KeyPress do formulário:
Private Sub Form1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles MyBase.KeyPress
If e.KeyChar = Convert.ToChar(13) Then
e.Handled = True
SendKeys.Send("{TAB}")
End If
End Sub
|
Agora vamos definir no evento Click do botão Converter para Extenso o código que realiza a conversão da data para extenso. Veja o código abaixo:
Private Sub btnConverter_Click(sender As Object, e As EventArgs) Handles btnConverter.Click
Try
Dim culture As New CultureInfo("pt-BR")
Dim formataData As DateTimeFormatInfo = culture.DateTimeFormat
'monta a data no formato dd-mm-aaaa
Dim data As String = txtDia.Text + "-" + txtMes.Text + "-" + txtAno.Text
'converte a string para datetime
Dim datainfo As DateTime = Convert.ToDateTime(data)
'converte o dia e o ano a para inteiro
Dim dia As Integer = datainfo.Day
Dim ano As Integer = datainfo.Year
'obtem o extenso para o dia, ano e mes
Dim dia_ext As String = getInteiroPorExtenso(dia)
Dim ano_ext As String = getInteiroPorExtenso(ano)
Dim mes_ext As String = culture.TextInfo.ToTitleCase(formataData.GetMonthName(datainfo.Month))
'obtem o dia da semana
Dim diasemana As String = culture.TextInfo.ToTitleCase(formataData.GetDayName(datainfo.DayOfWeek))
'monta a data por extenso
Dim dataExtenso As String = diasemana + "," + dia_ext & " de " & mes_ext & " de " & ano_ext
'exibe o resultado
txtResultado.Text = dataExtenso
Catch ex As Exception
MessageBox.Show("Erro : " + ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
txtDia.Focus()
End Try
End Sub
|
Criamos uma instância de CulterInfo() para o idioma Português e usando DateTimeFormatInfo obtemos informações da cultura específica sobre o formato de valores de data e hora:
Dim culture As New CultureInfo("pt-BR")
Dim formataData As DateTimeFormatInfo = culture.DateTimeFormat
Montamos a data informada nas caixas de texto no formato dd-mm-aaaa e convertemos de string para DateTime.
Dim data As String = txtDia.Text + "-" + txtMes.Text + "-" + txtAno.Text
Dim datainfo As DateTime = Convert.ToDateTime(data)
Obtemos o dia e o ano
para a da informada :
Dim dia As Integer = datainfo.Day
Dim ano As Integer = datainfo.Year
Obtemos o valor por extenso para o dia e ano usando a função getInteiroPorExtenso():
Dim dia_ext As String = getInteiroPorExtenso(dia)
Dim ano_ext As String = getInteiroPorExtenso(ano)
Obtemos o mês por extenso usando o método GetMonthName que retorna o nome completo de cultura específica do mês especificado com base na cultura associada com o atual objeto de DateTimeFormatInfo .
Dim mes_ext As String = culture.TextInfo.ToTitleCase(formataData.GetMonthName(datainfo.Month))
Montamos a data por extenso :
Dim dataExtenso As String = diasemana + "," + dia_ext & " de " & mes_ext & " de " & ano_ext
A seguir temos o código da função getInteiroPorExtenso() que recebe um inteiro e retorna o respectivo valor por extenso:
Public Function getInteiroPorExtenso(ByVal _numero As Integer) As String
Try
_numero = Int(_numero)
Select Case _numero
Case Is < 0
'Return "-" & getInteiroPorExtenso(-_numero)
Throw New Exception("Valor inválido")
Case 0
'Return ""
Throw New Exception("Valor inválido")
Case 1 To 19
Dim strArray() As String = _
{"Um", "Dois", "Três", "Quatro", "Cinco", "Seis", "Sete", "Oito", "Nove", "Dez", "Onze", "Doze", _
"Treze", "Quatorze", "Quinze", "Dezesseis", "Dezessete", "Dezoito", "Dezenove"}
Return strArray(_numero - 1) + " "
Case 20 To 99
Dim strArray() As String = {"Vinte", "Trinta", "Quarenta", "Cinquenta", "Sessenta", "Setenta", "Oitenta", "Noventa"}
If (_numero Mod 10) = 0 Then
Return strArray(_numero \ 10 - 2)
Else
Return strArray(_numero \ 10 - 2) + " e " + getInteiroPorExtenso(_numero Mod 10)
End If
Case 100
Return "Cem"
Case 101 To 999
Dim strArray() As String = {"Cento", "Duzentos", "Trezentos", "Quatrocentos", "Quinhentos", "Seiscentos", "Setecentos", "Oitocentos", "Novecentos"}
If (_numero Mod 100) = 0 Then
Return strArray(_numero \ 100 - 1) + " "
Else
Return strArray(_numero \ 100 - 1) + " e " + getInteiroPorExtenso(_numero Mod 100)
End If
Case 1000 To 1999
Select Case (_numero Mod 1000)
Case 0
Return "Mil"
Case Is <= 100
Return "Mil e " + getInteiroPorExtenso(_numero Mod 1000)
Case Else
Return "Mil " + getInteiroPorExtenso(_numero Mod 1000)
End Select
Case 2000 To 999999
Select Case (_numero Mod 1000)
Case 0
Return getInteiroPorExtenso(_numero \ 1000) & "Mil"
Case Is <= 100
Return getInteiroPorExtenso(_numero \ 1000) & "Mil e " & getInteiroPorExtenso(_numero Mod 1000)
Case Else
Return getInteiroPorExtenso(_numero \ 1000) & "Mil " & getInteiroPorExtenso(_numero Mod 1000)
End Select
Case Else
Return ""
End Select
Catch ex As Exception
Throw ex
End Try
End Function
|
Abaixo vemos a figura do projeto em execução para um data informada e o respectivo resultado obtido:
Pegue o projeto completo aqui: DataExtenso.zip
Salmos 19:1 Os céus proclamam a glória de Deus e o firmamento anuncia a obra das suas mãos.
Salmos 19:2 Um dia faz declaração a outro dia, e uma noite revela conhecimento a outra noite.
Salmos 19:3 Não há fala, nem palavras; não se lhes ouve a voz.
Veja os Destaques e novidades do SUPER DVD VB (sempre atualizado) : clique e confira ! Quer migrar para o VB .NET ? Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira... Quer aprender C# ??
Chegou o
Super DVD C# com exclusivo material de
suporte e vídeo aulas com curso básico sobre C# |
Gostou ? Compartilhe no Facebook Compartilhe no Twitter
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#