Autor Tópico: Dúvida para colocar um número por extenso  (Lida 6331 vezes)

Igor Menin

  • Visitante
Dúvida para colocar um número por extenso
« Online: Maio 12, 2008, 04:22:30 pm »
Pessoal, assim eu queria saber como que eu faço para colocar um número por extenso automaticamente? tipo eu digito em um capo um determinado valor e em um outro campo ou static text apareca o numero por extenso.

gratos..

att
Igor Menin

Davi

  • Global Moderator
  • *****
  • Mensagens: 426
  • Karma: +0/-0
Re: Dúvida para colocar um número por extenso
« Responder #1 Online: Maio 12, 2008, 06:01:50 pm »
Olá

eu ainda naum tenho o windev para testar.. e na vesão express naum tem essa opção, eu sei que da para converter funções escrita em VB para W   entaum a função que escreve por extenso ta ai:  ( EM VB6)

São duas funções... a de cima precisa da de baixo para funcionar.... caso não conseguir traduzir... copie e cole no VB6 e transforme uma dll ai vc consegue com certeza.


Davi

'Retorna frase extenso de um número (PORTUGUES)
'vgValor = numero para extenso, vgNaoMoeda = flag moeda/não moeda, vgNomeSing e vgNomePlur = Nome da moeda (sing/plural)
Public Function Extenso(ByVal vgValor As Currency, Optional ByVal vgNaoMoeda As Boolean, Optional ByVal vgNomeSing As String, Optional ByVal vgNomePlur As String) As String
 Dim vgNum As String                              'versão string do número
 Dim vgCents As Integer                           'porção decimal do número
 Dim vgBuffer As String                           'string em criação
 Dim vgTemp As String                             'retorno da função Conv3()
 Dim VgTamS As Variant                            'tamanho do arranjo
 Dim VgTamP As Variant                            'tamanho do arranjo
 VgTamS = Array("", " Mil", " Milhão", " Bilhão", " Trilhão")
 VgTamP = Array("", " Mil", " Milhões", " Bilhões", " Trilhões")
 If vgNomeSing = "" Then vgNomeSing = "Real"
 If vgNomePlur = "" Then vgNomePlur = "Reais"
 If vgNaoMoeda Then
  vgValor = Int(vgValor)
 End If
 'salva porção decimal como inteiro arredondado em 2 casas
 vgCents = Int((vgValor - Int(vgValor)) * 100)
 'descarta centavos
 vgValor = Int(vgValor)
 vgNum = CStr(vgValor)
 'adiciona zeros à frente para forçar tam múltiplo de 3
 If (Len(vgNum) Mod 3) > 0 Then
  vgNum = String$(3 - (Len(vgNum) Mod 3), "0") + vgNum
 End If
 'traduz cada grupo de 3 dígitos
 While Len(vgNum)
  'traduz parte esquerda
  vgTemp = Conv3(CInt(Left$(vgNum, 3)), vgBuffer)
  If Len(vgTemp) Then
   If CInt(Left$(vgNum, 3)) > 1 Then
    vgBuffer = vgBuffer + vgTemp + VgTamP((Len(vgNum) - 1) \ 3) + " "
   Else
    vgBuffer = vgBuffer + vgTemp + VgTamS((Len(vgNum) - 1) \ 3) + " "
   End If
  End If
  'remove os 3 characteres
  If Len(vgNum) > 3 Then
   vgNum = Mid$(vgNum, 4)
   'em caso de 1100=>1900 ou 1001=>1099 tem que colocar o "e"
   If vgNum > 0 And (vgNum Mod 100 = 0 Or vgNum < 100) Then vgBuffer = vgBuffer & "e "
  Else
   vgNum = ""
  End If
 Wend
 If Not vgNaoMoeda Then
  If vgValor > 1 Then
   vgBuffer = vgBuffer + vgNomePlur
  ElseIf vgValor <> 0 Then
   vgBuffer = vgBuffer + vgNomeSing
  End If
  If vgCents > 0 Then
   If vgValor > 0 Then vgBuffer = vgBuffer + " e "
   vgBuffer = vgBuffer + Conv3(vgCents, vgBuffer) + IIf(vgCents = 1, " Centavo", " Centavos")
  End If
 End If
 Extenso = vgBuffer
End Function





'converte número de 1,2 e 3 dígitos em texto (PORTUGUES)
Private Function Conv3(vgTres As Integer, Optional ExpAnt As String) As String
 Dim vgBuffer As String                           'string a montar
 Dim vgUnid As Variant                            'unidades
 Dim vgTens As Variant                            'dezenas
 Dim vgTeens As Variant                           'centenas
 Dim vgCem As Variant                             'centenas

 'enche arranjo de vetores
 vgUnid = Array("", "Um", "Dois", "Três", "Quatro", "Cinco", "Seis", "Sete", "Oito", "Nove")
 vgTens = Array("", "Dez", "Vinte", "Trinta", "Quarenta", "Cinquenta", "Sessenta", "Setenta", "Oitenta", "Noventa")
 vgTeens = Array("Dez", "Onze", "Doze", "Treze", "Quatorze", "Quinze", "Dezesseis", "Dezessete", "Dezoito", "Dezenove")
 vgCem = Array("Cem", "Cento", "Duzentos", "Trezentos", "Quatrocentos", "Quinhentos", "Seiscentos", "Setecentos", "Oitocentos", "Novecentos")
 If vgTres > 99 Then
  If vgTres = 100 Then
   vgBuffer = vgCem(vgTres \ 100 - 1)
  Else
   vgBuffer = vgCem(vgTres \ 100)
  End If
 Else
  vgBuffer = vgUnid(vgTres \ 100)
 End If

 'remove primeiro digito (se >= 100).
 vgTres = vgTres Mod 100
 'se número de vinte em diante
 If vgTres > 19 Then
  'pega string para segundo dígito
  If (vgTres Mod 10) >= 0 And Len(vgBuffer) > 0 Then
   vgBuffer = vgBuffer + " e "
  End If
  vgBuffer = vgBuffer + vgTens(vgTres \ 10)
 End If
 'adiciona conector
 If ((Len(vgBuffer) And (vgTres Mod 10) > 0) Or (vgTres = 10 And Len(ExpAnt$ + vgBuffer$) > 0)) And Right(vgBuffer, 3) <> " e " And (Right(ExpAnt, 3) <> " e " Or Len(vgBuffer) > 0) Then
  vgBuffer = vgBuffer + " e "
 End If

 'menor que 20...
 If vgTres > 9 And vgTres < 20 Then

  'pega string baseada no último dígito
  vgBuffer = vgBuffer + vgTeens(vgTres Mod 10)
 Else
  'se não, pega string do último dígito
  vgBuffer = vgBuffer + vgUnid(vgTres Mod 10)
 End If
 Conv3 = vgBuffer
End Function


Marcelo Braga

  • Global Moderator
  • *****
  • Mensagens: 123
  • Karma: +1/-0
Re: Dúvida para colocar um número por extenso
« Responder #2 Online: Maio 13, 2008, 01:59:28 pm »
Ola Igor, eu tenho a função por extenso pronta. entre em contato que eu te mando,
Abraços

Igor Menin

  • Visitante
Re: Dúvida para colocar um número por extenso
« Responder #3 Online: Maio 24, 2008, 09:06:14 am »
Marcelo Braga!

kra vc me mandou a função.. mas como eu sou novato, vc poderia me dizer bem certo como que eu faço pra ela funcionar?

Marcelo Braga

  • Global Moderator
  • *****
  • Mensagens: 123
  • Karma: +1/-0
Re: Dúvida para colocar um número por extenso
« Responder #4 Online: Maio 26, 2008, 06:03:18 pm »
Olha só no momento estou sem meu plugue do windev, mas se nao me engano os parametros sao os seguintes:

Sintax:

resultado = PorExtenso(Valor, Moeda_Singular DEFAULT="real", Moeda_Plural DEFAULT="reais", Fracao_Singular DEFAULT="centavo", Fracao_Plural DEFAULT="centavos")

Note que os nomes da moeda podem ser trocados por ex: para Metros e Centimetros mas sao opcionais. Se vc nao informar, a função assume Real e Centavo!

ex:
num is currency = 1575,34
numext is string
numext = PorExtenso(num,"km","kms","metro","metros")

Espero que tenha entendido, Abraços

molgora

  • Newbie
  • *
  • Mensagens: 1
  • Karma: +0/-0
Re:Dúvida para colocar um número por extenso
« Responder #5 Online: Junho 06, 2012, 01:10:08 pm »
Ai pessoal, segue uma rotina que adaptei...

para chama-la:
meuextenso = EXTENSO(125.25)       vai retornar CENTO E VINTE E CINCO REAIS E VINTE E CINCO CENTAVOS
meuextenso = EXTENSO(0.25)           vai retornar VINTE E CINCO CENTAVOS
meuextenso = EXTENSO(1125.25)

Saudações

Remmuk

  • Jr. Member
  • **
  • Mensagens: 61
  • Karma: +0/-0
Re:Dúvida para colocar um número por extenso
« Responder #6 Online: Junho 28, 2012, 05:41:59 am »
Olá.

Não lembro onde peguei esta procedure nem seu autor para os devidos créditos...mas eu a uso numa boa.
Espero que resolva teu problema.

Abraço.