segunda-feira, 6 de setembro de 2010

Transformando um valor Monetário em Extenso


Hoje me deparei com um problema que havia resolvido em um sistema desenvolvido em Filemaker 6, transformar um valor Monetário em Extenso para ser inserido num recibo. Então resolvi postar aqui para ajudar os desenvolvedores de lingua portuguesa. Bem vamos ao "Código":

Será necessario usar dois campos:

valor_monetário - Number
valor_extenso - Calculation - Result Text

No campo de calculo basta inserir esse código:
Choose(Int(Int(valor_numero /1000000)/100)
;"";"Cento";"Duzentos";"Trezentos";"Quatrocentos";"Quinhentos";"Seiscentos";"Setecentos";"Oitocentos";"Novecentos") & If(Int(Int(valor_numero /1000000)/100) > 0;" e ";"") &

Choose(Int(Mod(Int(valor_numero /1000000);100)/10);"";"";"Vinte ";"Trinta ";"Quarenta ";"Cinquenta"; "Sessenta ";"Setenta ";"Oitenta ";"Noventa ") &

Choose(If(Mod(Int(valor_numero /1000000);100) >= 20;Mod(Int(valor_numero /1000000);10); Mod(Int(valor_numero /1000000);100));""; "Um " ;"Dois " ;"Tres " ;"Quatro " ;"Cinco " ;"Seis " ;"Sete " ;"Oito ";"Nove " ;
"Dez " ;"Onze " ;"Doze " ;"Treze " ;"Quatorze " ;"Quinze ";"Dezesseis " ;
"Dezessete " ;"Dezoito " ;"Dezenove ") &

Case(Int(valor_numero /1000000) = 1;"Milhão, ";Int(valor_numero /1000000) > 1;"Milhões, ";"") & Choose(Int(Int((valor_numero -(Int(valor_numero /1000000) * 1000000 ))/1000)/100);"";"Cento";"Duzentos";"Trezentos";"Quatrocentos";"Quinhentos";"Seiscentos";"Setecentos";"Oitocentos";"Novecentos") & If(Int(Int((valor_numero -(Int(valor_numero /1000000) * 1000000 ))/1000)/100) > 0;" e ";"") &
Choose(Int(Mod(Int((valor_numero -(Int(valor_numero /1000000) * 1000000 ))/1000);100)/10);"";"";"Vinte ";"Trinta ";"Quarenta";"Cinquenta ";
"Sessenta ";"Setenta ";"Oitenta ";"Noventa ") &

Choose(If(Mod(Int((valor_numero -(Int(valor_numero /1000000) * 1000000 ))/1000);100) ≥ 20;Mod(Int((valor_numero -(Int(valor_numero /1000000) * 1000000 ))/1000);10);Mod(Int((valor_numero -(Int(valor_numero /1000000) * 1000000 ))/1000);100));
"";"Um " ;"Dois " ;"Tres " ;"Quatro " ;"Cinco " ;"Seis " ;"Sete " ;"Oito ";"Nove " ;
"Dez " ;"Onze " ;"Doze " ;"Treze " ;"Quatorze " ;"Quinze ";"Dezesseis " ;
"Dezessete " ;"Dezoito " ;"Dezenove ") &

If(Int((valor_numero -(Int(valor_numero /1000000) * 1000000 ))/1000) > 0;"Mil ";"") & Choose(Int(Int(Mod(valor_numero ;1000))/100);"";"Cento";"Duzentos";"Trezentos";"Quatrocentos";"Quinhentos";"Seiscentos";"Setecentos";"Oitocentos";"Novecentos") & If(Int(Int(Mod(valor_numero ;1000))/100) > 0;" e ";"") &
Choose(Int(Mod(Int(Mod(valor_numero ;1000));100)/10);"";"";"Vinte ";"Trinta ";"Quarenta";"Cinquenta ";
"Sessenta ";"Setenta ";"Oitenta ";"Noventa ") &

Choose(If(Mod(Int(Mod(valor_numero ;1000));100) >= 20;Mod(Int(Mod(valor_numero ;1000));10);Mod(Int(Mod(valor_numero ;1000));100));
"";"Um " ;"Dois " ;"Tres " ;"Quatro " ;"Cinco " ;"Seis " ;"Sete " ;"Oito ";"Nove " ;
"Dez " ;"Onze " ;"Doze " ;"Treze " ;"Quatorze " ;"Quinze ";"Dezesseis " ;
"Dezessete " ;"Dezoito " ;"Dezenove ") &

If(valor_numero < 1;""; If(valor_numero < 2;"Real";"Reais")) & " e " & Choose(Int(Mod((valor_numero -Int(valor_numero ))*100 +,0005;100)/10);"";"";"Vinte ";"Trinta ";"Quarenta ";"Cinquenta ";"Sessenta ";"Setenta ";"Oitenta ";"Noventa ") & Choose(If(Mod((valor_numero -Int(valor_numero ))*100 +,0005;100) >= 20;Mod((valor_numero -Int(valor_numero ))*100 +,0005;10);Mod((valor_numero -Int(valor_numero ))*100 +,0005;100));"";"Um " ;"Dois " ;"Tres " ;"Quatro " ;"Cinco " ;"Seis " ;"Sete " ;"Oito ";"Nove " ;"Dez " ;"Onze " ;"Doze " ;"Treze " ;"Quatorze " ;"Quinze ";"Dezesseis " ;"Dezessete " ;"Dezoito " ;"Dezenove ") &

If((valor_numero -Int(valor_numero ))*100 +,0005 < 1;" "; If((valor_numero -Int(valor_numero ))*100 +,0005 < 2;"Centavo";"Centavos"))

Esse script tem uma limitação, o valor vai até 999.999.999,99 e esta programado para a moeda corrente Brasileira R$.
Exemplo da Conversão, impressão de um recibo

Caso utilize seu sistema em outros países ou trabalha com outras moedas pode-se criar campos de configuração de moedas e substituir nos locais apropriados.
É isso, quem viu poste um comentário.

Abraços e sucesso a todos.

Atualizado em 09/09/2010

5 comentários:

  1. Muito bom esse código, me quebrou um galhão, parabéns pelo trabalho.

    Só tenho uma pergunta, uso Filemaker 9, o único problema e quando são zeros centavos, ex 100,00 aparece cem reais e.

    teria como tirar esse "e" no caso de sero centavos.

    ResponderExcluir
  2. Prezado Osmair,

    Fico muito grato pelo seu código. Resolveu um problema grande meu. Entretanto, me deparei com o mesmo problema do Joel, fiz uma pesquisa e encontrei uma solução, alterando o final do código, conforme vou colocar abaixo, pois condiciona a só escrever "e" se houver valor de centavos para colocar depois:

    If(valor_numero < 1;""; If(valor_numero < 2;"Real";"Reais")) & If(Mod(valor_numero; 1) and Int(valor_numero);" e ";"") &

    ResponderExcluir
  3. Este comentário foi removido pelo autor.

    ResponderExcluir

Gostou, ajudou ou tem algo a contribuir, deixe seu recado