none
Valor por extenso

    Question

  • Galera, chegou minha hora. Um momento que muitos de vocês já passaram.... "Vou trabalhar com Impressão !!!" Bom.. fora o exagero, como eu faço pra transformar um valor numérico em uma string por extenso...

    Tipo: R$1,00 = Um real

    R$ 10,15 = Dez reais e quinze centavos...

    Uso o Vb.net 2003

    Tuesday, September 05, 2006 2:02 PM

Answers

  • sempre usei essa func em vb6...

    Public Function Mostra_Extenso(nValor As String) As String
     
    If IsNull(nValor) Or nValor <= 0 Or nValor > 9999999.99 Then
      Mostra_Extenso = ""
      Exit Function
    End If

    'Declara as variáveis da função
    Dim nContador, nTamanho As Integer
    Dim cValor, cParte, cFinal As String
    ReDim aGrupo(4), aTexto(4) As String

    'Define matrizes com extensos parciais
    ReDim aUnid(19) As String
    aUnid(1) = "UM ": aUnid(2) = "DOIS ": aUnid(3) = "TRES "
    aUnid(4) = "QUATRO ": aUnid(5) = "CINCO ": aUnid(6) = "SEIS "
    aUnid(7) = "SETE ": aUnid(8) = "OITO ": aUnid(9) = "NOVE "
    aUnid(10) = "DEZ ": aUnid(11) = "ONZE ": aUnid(12) = "DOZE "
    aUnid(13) = "TREZE ": aUnid(14) = "QUATORZE ": aUnid(15) = "QUINZE "
    aUnid(16) = "DEZESSEIS ": aUnid(17) = "DEZESSETE ": aUnid(18) = "DEZOITO "
    aUnid(19) = "DEZENOVE "

    ReDim aDezena(9) As String
    aDezena(1) = "DEZ ": aDezena(2) = "VINTE ": aDezena(3) = "TRINTA "
    aDezena(4) = "QUARENTA ": aDezena(5) = "CINQUENTA "
    aDezena(6) = "SESSENTA ": aDezena(7) = "SETENTA ": aDezena(8) = "OITENTA "
    aDezena(9) = "NOVENTA "

    ReDim aCentena(9) As String
    aCentena(1) = "CENTO ":  aCentena(2) = "DUZENTOS "
    aCentena(3) = "TREZENTOS ": aCentena(4) = "QUATROCENTOS "
    aCentena(5) = "QUINHENTOS ": aCentena(6) = "SEISCENTOS "
    aCentena(7) = "SETECENTOS ": aCentena(8) = "OITOCENTOS "
    aCentena(9) = "NOVECENTOS "

    'Divide o valor em vários grupos
    cValor = Format$(nValor, "0000000000.00")
    aGrupo(1) = Mid$(cValor, 2, 3)
    aGrupo(2) = Mid$(cValor, 5, 3)
    aGrupo(3) = Mid$(cValor, 8, 3)
    aGrupo(4) = "0" + Mid$(cValor, 12, 2)

    'Processa cada grupo
    For nContador = 1 To 4
      cParte = aGrupo(nContador)
      nTamanho = Switch(Val(cParte) < 10, 1, Val(cParte) < 100, 2, Val(cParte) < 1000, 3)
      If nTamanho = 3 Then
        If Right$(cParte, 2) <> "00" Then
          aTexto(nContador) = aTexto(nContador) + aCentena(Left(cParte, 1)) + "E "
          nTamanho = 2
        Else
          aTexto(nContador) = aTexto(nContador) + IIf(Left$(cParte, 1) = "1", "CEM ", aCentena(Left(cParte, 1)))
        End If
      End If
      If nTamanho = 2 Then
        If Val(Right(cParte, 2)) < 20 Then
          aTexto(nContador) = aTexto(nContador) + aUnid(Right(cParte, 2))
        Else
          aTexto(nContador) = aTexto(nContador) + aDezena(Mid(cParte, 2, 1))
          If Right$(cParte, 1) <> "0" Then
            aTexto(nContador) = aTexto(nContador) + "E "
            nTamanho = 1
          End If
        End If
      End If
      If nTamanho = 1 Then
        aTexto(nContador) = aTexto(nContador) + aUnid(Right(cParte, 1))
      End If
    Next

    'Gera o formato final do texto
    If Val(aGrupo(1) + aGrupo(2) + aGrupo(3)) = 0 And Val(aGrupo(4)) <> 0 Then
      cFinal = aTexto(4) + IIf(Val(aGrupo(4)) = 1, "CENTAVO", "CENTAVOS")
    Else
      cFinal = ""
      cFinal = cFinal + IIf(Val(aGrupo(1)) <> 0, aTexto(1) + IIf(Val(aGrupo(1)) > 1, "MILHÕES ", "MILHÃO "), "")
      If Val(aGrupo(2) + aGrupo(3)) = 0 Then
        cFinal = cFinal + "DE "
      Else
        cFinal = cFinal + IIf(Val(aGrupo(2)) <> 0, aTexto(2) + "MIL ", "")
      End If
      cFinal = cFinal + aTexto(3) + IIf(Val(aGrupo(1) + aGrupo(2) + aGrupo(3)) = 1, "REAL ", "REAIS ")
      cFinal = cFinal + IIf(Val(aGrupo(4)) <> 0, "E " + aTexto(4) + IIf(Val(aGrupo(4)) = 1, "CENTAVO", "CENTAVOS"), "")
    End If

    Mostra_Extenso = cFinal

    End Function

    Tuesday, September 05, 2006 7:25 PM

All replies

  • Ola Paulo,

            Veja se um desses links te ajuda:
    http://forum.imasters.com.br/index.php?showtopic=133677&hl=extenso
    http://www.csharphelp.com/board2/read.html?f=1&i=49041&t=48973&v=t
    http://www.forumweb.com.br/foruns/index.php?showtopic=7392

    Qualquer dúvida é só postar
    Se este post lhe foi útil marque como respondido
    Att
    Henrique Gurgacz
    Tuesday, September 05, 2006 2:58 PM
  • Estou usando uma aplicação VB.NET. Alguém tem algo mais fácil??
    Tuesday, September 05, 2006 5:36 PM
  • sempre usei essa func em vb6...

    Public Function Mostra_Extenso(nValor As String) As String
     
    If IsNull(nValor) Or nValor <= 0 Or nValor > 9999999.99 Then
      Mostra_Extenso = ""
      Exit Function
    End If

    'Declara as variáveis da função
    Dim nContador, nTamanho As Integer
    Dim cValor, cParte, cFinal As String
    ReDim aGrupo(4), aTexto(4) As String

    'Define matrizes com extensos parciais
    ReDim aUnid(19) As String
    aUnid(1) = "UM ": aUnid(2) = "DOIS ": aUnid(3) = "TRES "
    aUnid(4) = "QUATRO ": aUnid(5) = "CINCO ": aUnid(6) = "SEIS "
    aUnid(7) = "SETE ": aUnid(8) = "OITO ": aUnid(9) = "NOVE "
    aUnid(10) = "DEZ ": aUnid(11) = "ONZE ": aUnid(12) = "DOZE "
    aUnid(13) = "TREZE ": aUnid(14) = "QUATORZE ": aUnid(15) = "QUINZE "
    aUnid(16) = "DEZESSEIS ": aUnid(17) = "DEZESSETE ": aUnid(18) = "DEZOITO "
    aUnid(19) = "DEZENOVE "

    ReDim aDezena(9) As String
    aDezena(1) = "DEZ ": aDezena(2) = "VINTE ": aDezena(3) = "TRINTA "
    aDezena(4) = "QUARENTA ": aDezena(5) = "CINQUENTA "
    aDezena(6) = "SESSENTA ": aDezena(7) = "SETENTA ": aDezena(8) = "OITENTA "
    aDezena(9) = "NOVENTA "

    ReDim aCentena(9) As String
    aCentena(1) = "CENTO ":  aCentena(2) = "DUZENTOS "
    aCentena(3) = "TREZENTOS ": aCentena(4) = "QUATROCENTOS "
    aCentena(5) = "QUINHENTOS ": aCentena(6) = "SEISCENTOS "
    aCentena(7) = "SETECENTOS ": aCentena(8) = "OITOCENTOS "
    aCentena(9) = "NOVECENTOS "

    'Divide o valor em vários grupos
    cValor = Format$(nValor, "0000000000.00")
    aGrupo(1) = Mid$(cValor, 2, 3)
    aGrupo(2) = Mid$(cValor, 5, 3)
    aGrupo(3) = Mid$(cValor, 8, 3)
    aGrupo(4) = "0" + Mid$(cValor, 12, 2)

    'Processa cada grupo
    For nContador = 1 To 4
      cParte = aGrupo(nContador)
      nTamanho = Switch(Val(cParte) < 10, 1, Val(cParte) < 100, 2, Val(cParte) < 1000, 3)
      If nTamanho = 3 Then
        If Right$(cParte, 2) <> "00" Then
          aTexto(nContador) = aTexto(nContador) + aCentena(Left(cParte, 1)) + "E "
          nTamanho = 2
        Else
          aTexto(nContador) = aTexto(nContador) + IIf(Left$(cParte, 1) = "1", "CEM ", aCentena(Left(cParte, 1)))
        End If
      End If
      If nTamanho = 2 Then
        If Val(Right(cParte, 2)) < 20 Then
          aTexto(nContador) = aTexto(nContador) + aUnid(Right(cParte, 2))
        Else
          aTexto(nContador) = aTexto(nContador) + aDezena(Mid(cParte, 2, 1))
          If Right$(cParte, 1) <> "0" Then
            aTexto(nContador) = aTexto(nContador) + "E "
            nTamanho = 1
          End If
        End If
      End If
      If nTamanho = 1 Then
        aTexto(nContador) = aTexto(nContador) + aUnid(Right(cParte, 1))
      End If
    Next

    'Gera o formato final do texto
    If Val(aGrupo(1) + aGrupo(2) + aGrupo(3)) = 0 And Val(aGrupo(4)) <> 0 Then
      cFinal = aTexto(4) + IIf(Val(aGrupo(4)) = 1, "CENTAVO", "CENTAVOS")
    Else
      cFinal = ""
      cFinal = cFinal + IIf(Val(aGrupo(1)) <> 0, aTexto(1) + IIf(Val(aGrupo(1)) > 1, "MILHÕES ", "MILHÃO "), "")
      If Val(aGrupo(2) + aGrupo(3)) = 0 Then
        cFinal = cFinal + "DE "
      Else
        cFinal = cFinal + IIf(Val(aGrupo(2)) <> 0, aTexto(2) + "MIL ", "")
      End If
      cFinal = cFinal + aTexto(3) + IIf(Val(aGrupo(1) + aGrupo(2) + aGrupo(3)) = 1, "REAL ", "REAIS ")
      cFinal = cFinal + IIf(Val(aGrupo(4)) <> 0, "E " + aTexto(4) + IIf(Val(aGrupo(4)) = 1, "CENTAVO", "CENTAVOS"), "")
    End If

    Mostra_Extenso = cFinal

    End Function

    Tuesday, September 05, 2006 7:25 PM
  • ola , estou a usar seu codigo , mas gostaria de entende-lo tambem 

    esta parte abaixo não entendi

    oq seria , faria o Mid$ ...  e pq 2 ,3  depois 5,3 etc ..  

    'Divide o valor em vários grupos
    cValor = Format$(nValor, "0000000000.00")
    aGrupo(1) = Mid$(cValor, 2, 3)
    aGrupo(2) = Mid$(cValor, 5, 3)
    aGrupo(3) = Mid$(cValor, 8, 3)
    aGrupo(4) = "0" + Mid$(cValor, 12, 2)

    vlw mesmo , ^^


    AleSaggiorato

    Tuesday, July 31, 2012 8:12 AM