lib/extenso_pt.rb in extenso_pt-0.4.3 vs lib/extenso_pt.rb in extenso_pt-0.4.4
- old
+ new
@@ -13,47 +13,47 @@
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"]}
- # Produz a moeda e o extenso da parte fracionaria do valor monetário em portugûes de portugal ou brasil.
+ # Produz a moeda e o extenso da parte fracionária 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] a moeda e o extenso da parte fracionaria do valor monetário
+ # @param [Integer] fracao parte fracionária do valor monetário ex: 100022.12 = 12
+ # @return [String] a moeda e o extenso da parte fracionária 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 dum valor (entre 0-999) em portugûes de portugal ou brasil.
+ # Produz o extenso dum grupo de 3 digitos em portugûes de portugal ou brasil.
#
- # @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
+ # @param [Integer] mil o valor dum grupo de 3 digitos a converter
+ # @param [Integer] pos posição deste grupo de 3 digitos no valor monetário em tratamento
+ # @return [String] o extenso de <mil>
def self.e999(mil,pos=0)
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.
+ # Produz o extenso da parte inteira do valor monetário em portugûes de portugal ou brasil.
#
- # @param [Integer] pos posição actual do valor monetário em tratamento
+ # @param [Integer] pos posição actual nos grupos de 3 digitos 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="")
+ # @return [String] o extenso da parte inteira do valor monetário
+ def self.einteira(pos=0,ext="")
if (pos>=@@ai.count)
ext
else
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)
+ einteira(pos+1,ext)
end
end
# Converte um objeto no seu extenso em portugûes de portugal ou brasil.
#
@@ -63,27 +63,34 @@
# @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"})
+ # parametrização da moeda
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
+ # converte os valores do Hash nos seus extensos mantendo 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
+ # 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.efracao((n[/\.\d*/].to_f*100).round)
+ if (@@ai.count>8)
+ "" # MAX 1e24
+ else
+ ExtensoPt.einteira+
+ # parte fracionária é arredondada a 2 casas decimais (cêntimos)
+ ExtensoPt.efracao((n[/\.\d*/].to_f*100).round)
+ end
end
end
end
class Hash; include ExtensoPt;end