lib/extenso_pt.rb in extenso_pt-0.4.2 vs lib/extenso_pt.rb in extenso_pt-0.4.3
- old
+ new
@@ -13,116 +13,77 @@
A1000={pt: ["","CEM","CENTO","DUZENTOS","TREZENTOS","QUATROCENTOS","QUINHENTOS","SEISCENTOS","SETECENTOS","OITOCENTOS","NOVECENTOS"],
br: ["","CEM","CENTO","DUZENTOS","TREZENTOS","QUATROCENTOS","QUINHENTOS","SEISCENTOS","SETECENTOS","OITOCENTOS","NOVECENTOS"]}
A1e24={pt: ["","MIL"," MILHÃO"," MIL MILHÃO"," BILIÃO"," MIL BILIÃO"," TRILIÃO"," MIL TRILIÃO",""," MIL"," MILHÕES"," MIL MILHÕES"," BILIÕES"," MIL BILIÕES"," TRILIÕES"," MIL TRILIÕES"],
br: ["","MIL"," MILHÃO"," BILHÃO"," TRILHÃO"," QUADRILHÃO"," QUINTILHÃO"," SEXTILHÃO",""," MIL"," MILHÕES"," BILHÕES"," TRILHÕES"," QUADRILHÕES"," QUINTILHÕES"," SEXTILHÕES"]}
- # Controle proposicao E
+ # Produz a moeda e o extenso da parte fracionaria do valor monetário em portugûes de portugal ou brasil.
#
- # @param [Integer] valor parcela do valor monetario
- # @return [String] produz E entre centenas e dezenas
- def self.f1(valor)valor>100&&valor%100>0?" E ":""end
-
- # Controle proposicao E
- #
- # @param [Integer] valor parcela do valor monetario
- # @return [String] produz E entre dezenas e unidades
- def self.f2(valor)valor>20&&valor%10>0?" E ":""end
-
- # Controle proposicao E
- #
- # @param [Integer] valor parcela do valor monetario
- # @return [String] produz E entre pacelas
- def self.f3(valor)valor>100?" ":valor>0?" E ":""end
-
- # Controle singular/plural da parte inteira
- #
- # @param [Integer] inteira soma da parte inteira
- # @return [String] produz terminacao da parte inteira
- def self.f4(inteira)inteira>0?inteira>1?" "+@@mp:" "+@@ms:""end
-
- # Controle singular/plural da parte fracionaria
- #
# @param [Integer] fracao parte fracionaria do valor monetário ex: 100022.12 = 12
- # @return [String] produz terminacao da parte fracionaria
- def self.f5(fracao)fracao>0?fracao>1?" "+@@cp:" "+@@cs:""end
-
- # Controle separador entre parte inteira e fracionaria
- #
- # @param [Integer] inteira soma da parte inteira
- # @param [Integer] fracao parte fracionaria do valor monetário ex: 100022.12 = 12
- # @return [String] produz E entre parte inteira e fracionaria
- def self.f6(inteira,fracao)inteira>0&&fracao>0?" E ":""end
-
- # Controle de palavras no final do extenso
- #
- # @param [Integer] total soma da parte inteira e fracionaria para controle de ZERO
- # @return [String] produz DE/ZERO <plural moeda>
- def self.f7(total)
- if (@@ai[2..-1].to_a.find{|v|v>0}.to_i>0&&@@ai[0..1].inject(:+).to_i==0)
- " DE"
- elsif (@@ai.count>0&&total==0)
- "ZERO "+@@mp
- else
- ""
- end
+ # @return [String] a moeda e o extenso da parte fracionaria do valor monetário
+ def self.efracao(fracao)
+ inteira=@@ai.find{|v|v>0}.to_i+@@ai[1..-1].to_a.find{|v|v>0}.to_i
+ total=inteira+fracao
+ (@@ai[2..-1].to_a.find{|v|v>0}.to_i>0&&@@ai[0..1].inject(:+).to_i==0?" DE":@@ai.count>0&&total==0?"ZERO "+@@mp:"")+
+ (inteira>0?inteira>1?" "+@@mp:" "+@@ms:"")+
+ (inteira>0&&fracao>0?" E ":"")+e999(fracao)+
+ (fracao>0?fracao>1?" "+@@cp:" "+@@cs:"")
end
- # Produz o extenso da parte fracionaria do valor monetário em portugûes de portugal ou brasil.
- #
- # @param [Integer] fracao parte fracionaria do valor monetário ex: 100022.12 = 12
- # @return [String] o extenso da parte fracionaria do valor monetário
- def self.fracao(fracao)
- t=@@ai.find{|v|v>0}.to_i+@@ai[1..-1].to_a.find{|v|v>0}.to_i
- f7(t+fracao)+f4(t)+f6(t,fracao)+e999(fracao)+f5(fracao)
- end
-
# Produz o extenso dum valor (entre 0-999) em portugûes de portugal ou brasil.
#
- # @param [Integer] mil a converter
- # @param [Integer] pos posição actual em tratamento
- # @return [String] o extenso do [Integer] mil
+ # @param [Integer] mil o valor a converter
+ # @param [Integer] pos posição actual de mil no valor monetário em tratamento
+ # @return [String] o extenso de mil
def self.e999(mil,pos=0)
- s=mil%100
- A1000[@@lc][(mil>100?1:0)+mil/100]+f1(mil)+A0100[@@lc][s/10]+f2(s)+A0020[@@lc][pos==1&&mil==1?0:s<20?s:s%10]
+ cem=mil%100
+ A1000[@@lc][(mil>100?1:0)+mil/100]+(mil>100&&mil%100>0?" E ":"")+
+ A0100[@@lc][cem/10]+(mil>20&&mil%10>0?" E ":"")+
+ A0020[@@lc][pos==1&&mil==1?0:cem<20?cem:cem%10]
end
# Produz recursivamente o extenso da parte inteira do valor monetário em portugûes de portugal ou brasil.
#
- # @param [Integer] pos posição actual em tratamento
+ # @param [Integer] pos posição actual do valor monetário em tratamento
# @param [String] ext extenso actual em tratamento
# @return [String] o extenso da parte inteira
def self.erecursivo(pos=0,ext="")
if (pos>=@@ai.count)
ext
else
- erecursivo(pos+1,e999(@@ai[pos],pos)+A1e24[@@lc][@@ai[pos]>0?@@ai[pos]>1?8+pos:pos:0]+f3(pos>0?@@ai[pos-1]:0)+ext)
+ ctl=pos>0?@@ai[pos-1]:0
+ ext=e999(@@ai[pos],pos)+A1e24[@@lc][@@ai[pos]>0?@@ai[pos]>1?8+pos:pos:0]+(ctl>100?" ":ctl>0?" E ":"")+ext
+ erecursivo(pos+1,ext)
end
end
# Converte um objeto no seu extenso em portugûes de portugal ou brasil.
#
# @param [Hash] moeda as opcoes para parametrizar a moeda/fração
# @option moeda [Symbol] :lc locale do extenso - portugûes de portugal (:pt) ou brasil (:br)
- # @option moeda [String] :msingular Moeda no singular - por defeito pode ser obtida do <b>:mplural menos "S"</b> (se terminar em "S")
- # @option moeda [String] :fsingular Fração no singular - por defeito pode ser obtida do <b>:fplural menos "S"</b> (se terminar em "S")
- # @option moeda [String] :mplural Moeda no plural - por defeito pode ser obtida do <b>:msingular+"S"</b>
- # @option moeda [String] :fplural Fração no plural - por defeito pode ser obtida do <b>:fsingular+"S"</b>
+ # @option moeda [String] :msingular Moeda no singular - pode ser inferido do <b>:mplural menos "S"</b>
+ # @option moeda [String] :fsingular Fração no singular - pode ser inferido do <b>:fplural menos "S"</b>
+ # @option moeda [String] :mplural Moeda no plural - pode ser inferido do <b>:msingular+"S"</b>
+ # @option moeda [String] :fplural Fração no plural - pode ser inferido do <b>:fsingular+"S"</b>
# @return [String, Array<String>, Hash<String>] extenso se o objecto for (String, Float, Integer), Array dos extensos se o objecto for (Array, Range) ou Hash dos extensos se o objecto for (Hash)
def extenso(moeda={lc:(:pt),msingular:"EURO",fsingular:"CÊNTIMO"})
moeda={lc:(:br),msingular:"REAL",mplural:"REAIS",fsingular:"CENTAVO"} if (moeda[:lc]==:br&&!moeda[:mplural]&&!moeda[:fplural])
@@lc=LC.include?(moeda[:lc])?moeda[:lc]:(:pt)
@@ms=moeda[:msingular]?moeda[:msingular]:moeda[:mplural].to_s[-1]=="S"?moeda[:mplural][0..-2]:"EURO"
@@cs=moeda[:fsingular]?moeda[:fsingular]:moeda[:fplural].to_s[-1]=="S"?moeda[:fplural][0..-2]:"CÊNTIMO"
@@mp=moeda[:mplural]?moeda[:mplural]:@@ms+"S"
@@cp=moeda[:fplural]?moeda[:fplural]:@@cs+"S"
if (self.kind_of?Hash)
+ # converte os valores do Hash nos seus extensos mantendos as chaves devolve um Hash
self.map{|k,v|[k,v.extenso(lc:(@@lc),msingular:@@ms,fsingular:@@cs,mplural:@@mp,fplural:@@cp)]}.to_h
elsif (self.respond_to?:to_a)
+ # converte o objecto num Array e converte os valores nos seus extensos devolve um Array
self.to_a.map{|a|a.extenso(lc:(@@lc),msingular:@@ms,fsingular:@@cs,mplural:@@mp,fplural:@@cp)}
else
+ # converter com bigdecimal/util para evitar bugs com valores superiores a 1e12
n=self.to_d.to_s('F')
+ # dividir parte inteira em grupos de 3 digitos ex: 123022.12 => [22, 123]
@@ai=n[/^\d+/].to_s.reverse.scan(/\d{1,3}/).map{|i|i.reverse.to_i}
- @@ai.count>8?"":ExtensoPt.erecursivo+ExtensoPt.fracao((n[/\.\d*/].to_f*100).round)
+ @@ai.count>8?"":ExtensoPt.erecursivo+ExtensoPt.efracao((n[/\.\d*/].to_f*100).round)
end
end
end
class Hash; include ExtensoPt;end