VB.NET - Convertendo Números para valores Reais em extenso
Como muita gente me pergunta se não existe uma função para converter valores monetários para extenso estou publicando esta dica.
Abra o Visual Studio 2008 Express Edition e crie um novo projeto do tipo Windows Forms Application com o nome Extenso.
A seguir no formulário padrão form1.vb inclua os seguintes controles:
Defina o seguinte leiaute no formulário:
A seguir inclua o seguinte código no formulário:
''' <summary> ''' Função principal que recolhe o valor e chama as duas funções ''' auxiliares para a parte inteira e para a parte decimal ''' </summary> ''' <param name="number">Número a converter para extenso (Reais)</param> ''' Public Function NumeroToExtenso(ByVal number As Decimal) As String Dim cent As Integer Try ' se for =0 retorna 0 reais If number = 0 Then Return "Zero Reais" End If ' Verifica a parte decimal, ou seja, os centavos cent = Decimal.Round((number - Int(number)) * 100, MidpointRounding.ToEven) ' Verifica apenas a parte inteira number = Int(number) ' Caso existam centavos If cent > 0 Then ' Caso seja 1 não coloca "Reais" mas sim "Real" If number = 1 Then Return "Um Real e " + getDecimal(cent) + "centavos" ' Caso o valor seja inferior a 1 Real ElseIf number = 0 Then Return getDecimal(cent) + "centavos" Else Return getInteger(number) + "Reais e " + getDecimal(cent) + "centavos" End If Else ' Caso seja 1 não coloca "Reais" mas sim "Real" If number = 1 Then Return "Um Real" Else Return getInteger(number) + "Reais" End If End If Catch ex As Exception Return "" End Try End Function ''' <summary> ''' Função auxiliar - Parte decimal a converter ''' </summary> ''' <param name="number">Parte decimal a converter</param> Public Function getDecimal(ByVal number As Byte) As String Try Select Case number Case 0 Return "" 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(number - 1) + " " Case 20 To 99 Dim strArray() As String = _ {"Vinte", "Trinta", "Quarenta", "Cinquenta", _ "Sessenta", "Setenta", "Oitenta", "Noventa"} If (number Mod 10) = 0 Then Return strArray(number \ 10 - 2) + " " Else Return strArray(number \ 10 - 2) + " e " + getDecimal(number Mod 10) + " " End If Case Else Return "" End Select Catch ex As Exception Return "" End Try End Function ''' <summary> ''' Função auxiliar - Parte inteira a converter ''' </summary> ''' <param name="number">Parte inteira a converter</param> Public Function getInteger(ByVal number As Decimal) As String Try number = Int(number) Select Case number Case Is < 0 Return "-" & getInteger(-number) Case 0 Return "" 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(number - 1) + " " Case 20 To 99 Dim strArray() As String = _ {"Vinte", "Trinta", "Quarenta", "Cinquenta", _ "Sessenta", "Setenta", "Oitenta", "Noventa"} If (number Mod 10) = 0 Then Return strArray(number \ 10 - 2) Else Return strArray(number \ 10 - 2) + " e " + getInteger(number 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 (number Mod 100) = 0 Then Return strArray(number \ 100 - 1) + " " Else Return strArray(number \ 100 - 1) + " e " + getInteger(number Mod 100) End If Case 1000 To 1999 Select Case (number Mod 1000) Case 0 Return "Mil" Case Is <= 100 Return "Mil e " + getInteger(number Mod 1000) Case Else Return "Mil, " + getInteger(number Mod 1000) End Select Case 2000 To 999999 Select Case (number Mod 1000) Case 0 Return getInteger(number \ 1000) & "Mil" Case Is <= 100 Return getInteger(number \ 1000) & "Mil e " & getInteger(number Mod 1000) Case Else Return getInteger(number \ 1000) & "Mil, " & getInteger(number Mod 1000) End Select Case 1000000 To 1999999 Select Case (number Mod 1000000) Case 0 Return "Um Milhão" Case Is <= 100 Return getInteger(number \ 1000000) + "Milhão e " & getInteger(number Mod 1000000) Case Else Return getInteger(number \ 1000000) + "Milhão, " & getInteger(number Mod 1000000) End Select Case 2000000 To 999999999 Select Case (number Mod 1000000) Case 0 Return getInteger(number \ 1000000) + " Milhões" Case Is <= 100 Return getInteger(number \ 1000000) + "Milhões e " & getInteger(number Mod 1000000) Case Else Return getInteger(number \ 1000000) + "Milhões, " & getInteger(number Mod 1000000) End Select Case 1000000000 To 1999999999 Select Case (number Mod 1000000000) Case 0 Return "Um Bilhão" Case Is <= 100 Return getInteger(number \ 1000000000) + "Bilhão e " + getInteger(number Mod 1000000000) Case Else Return getInteger(number \ 1000000000) + "Bilhão, " + getInteger(number Mod 1000000000) End Select Case Else Select Case (number Mod 1000000000) Case 0 Return getInteger(number \ 1000000000) + " Bilhões" Case Is <= 100 Return getInteger(number \ 1000000000) + "Bilhões e " + getInteger(number Mod 1000000000) Case Else Return getInteger(number \ 1000000000) + "Bilhões, " + getInteger(number Mod 1000000000) End Select End Select Catch ex As Exception Return "" End Try End Function Private Sub btnConverter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConverter.Click If txtValor.Text = String.Empty Then MsgBox("Informe um valor válido. Ex: 123.456.258,99") Else Me.txtExtenso.Text = NumeroToExtenso(Me.txtValor.Text) End If End Sub Private Sub txtValor_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtValor.KeyPress If Not Char.IsNumber(e.KeyChar) And Not e.KeyChar = vbBack And Not e.KeyChar = "." And Not e.KeyChar = "," Then e.Handled = True End If End Sub End Class |
Não há muito o que explicar neste código pois temos apenas 3 rotinas:
No evento Click do botão de comando Converter efetuamos a conversão para extenso.
No evento KeyPress do TextBox - txtValor - somente permitimos a digitação de números , ponto e vírgula.
Executando o projeto para um valor válido obtemos:
Um projeto muito simples mas que mostra como é fácil trabalhar com o VB .NET. Nem preciso dizer que você pode incrementar o projeto eu apenas quis mostrar como converter valores para reais. (A rotina suporta até bilhões de reais)
O resto é com você...
Pegue o projeto completo aqui: Extenso.zip
Eu sei é apenas VB .NET mas eu gosto...
Nota: Este código foi adaptado de um projeto similar de autoria de
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#