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:


José Carlos Macoratti