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#