lib/extenso_pt/extenso.rb in extenso_pt-0.6.6 vs lib/extenso_pt/extenso.rb in extenso_pt-0.6.7

- old
+ new

@@ -30,36 +30,31 @@ # Produz extenso da parte fracionaria em portugues de portugal ou brasil # # @return [String] extenso da parte fracionaria def self.ef99 - # parametrizacao por defeito - @cs ||= 'CÊNTIMO' - @cp ||= @cs + 'S' - if @nf.positive? - e090(@nf) + e009(@nf) + (@nf > 1 ? ' ' + @cp : ' ' + @cs) + e090(@nf) + e009(@nf) + (@nf > 1 ? ' ' + @fp : ' ' + @fs) else '' end end # Produz final da moeda em portugues de portugal ou brasil # # @return [String] final da moeda def self.efim - # parametrizacao por defeito - @ms ||= 'EURO' - @mp ||= @ms + 'S' - - # proposicao DE entre parte inteira e moeda - emo = @de ? ' DE' : '' - # moeda singular/plural - emo += @tt > 1 ? ' ' + @mp : ' ' + @ms if @tt.positive? - # proposicao E entre moeda e parte fracionaria - # extenso da parte fracionaria - emo + (@tt.positive? && @nf.positive? ? ' E ' : '') + ef99 + if c124.positive? + # proposicao DE entre parte inteira e moeda + # moeda singular/plural + # proposicao E entre moeda e parte fracionaria + (cpde? ? ' DE ' : ' ') + + (c124 > 1 ? @mp : @ms) + + (@nf.positive? ? ' E ' : '') + else + '' + end + ef99 end # Produz separador entre grupos 3 digitos # # @param [Integer] pos posicao actual nos grupos 3 digitos @@ -85,131 +80,34 @@ end # Produz extenso de grupo 3 digitos em portugues de portugal ou brasil # # @param [Integer] pos posicao actual nos grupos 3 digitos - # @return [String] extenso grupo 3 digitos + # @return [String] extenso do grupo 3 digitos def self.edg3(pos) # caso especial MIL EUROS if pos == 1 && @ai[pos] == 1 '' else e900(@ai[pos]) + e090(@ai[pos] % 100) + e009(@ai[pos] % 100) end + e124(pos) end - # Parametrizar controle singular/plural & proposicoes + # Produz extenso da parte inteira (@ai) e fracionaria (@nf) # - # @return [void] - def self.epsp - # soma grupos 1,2 (primeiros 6 digitos) - @s6 = @ai[0].to_i + @ai[1].to_i * 2 - # soma grupos 3.. (digitos acima de 6) - @m6 = @ai[2..-1].to_a.inject(:+).to_i * 2 - # parametrizar controle de proposicao E & singular/plural - @tt = @s6 + @m6 - # parametrizar controle de proposicao DE - @de = @s6.zero? && @m6.positive? - end - - # Produz extenso em portugues de portugal ou brasil - # - # @param [Integer] pos posicao actual nos grupos 3 digitos do valor monetario + # @param [Integer] pos posicao no grupo 3 digitos # @param [String] ext extenso em construcao - # @return [String] o extenso dum valor monetario - def self.etot(pos, ext) + # @return [String] extenso do valor monetario + def self.ejun(pos, ext) # testa fim do valor monetario if pos >= @ai.count - # parametrizar variaveis de controle - epsp - - # caso especial zero - (@tt + @nf).zero? ? 'ZERO ' + @mp : ext + efim + # caso especial de zero + (c124 + @nf).zero? ? 'ZERO ' + @mp : ext + efim else - # tratamento de grupo 3 digitos - etot(pos + 1, edg3(pos) + ext) + # converte grupo 3 digitos na posicao corrente + # envoca proxima posicao + ejun(pos + 1, edg3(pos) + ext) end end - - # Parametrizar parte inteira/fracionaria da string digitos - # - # @param [String] digitos do valor monetario - # @return [void] - def self.epif(dig) - # parametrizacao por defeito - # the first mention of an @<variable> creates the - # instance variable in the current object ie: self = ExtensoPt - @lc ||= :pt - - # converte parte inteira da string digitos em array com grupos de 3 digitos - # ex: 123022.12 => [22, 123] - @ai = dig[/^\d+/].to_s.reverse.scan(/\d{1,3}/).map { |i| i.reverse.to_i } - - # obtem parte fracionaria da string digitos - # ex: 123022.12 => 12 - # arredondada a 2 casas decimais (centimos/centavos) - @nf = (dig[/\.\d*/].to_f * 100).round - end - - # Converte objeto criando extenso(s) em portugues de portugal ou brasil - # - # @param [Object] obj objeto a converter - # (String, Float, Integer, Array, Range, Hash) - # @return [String, Array, Hash] string extenso - # se objecto for (String, Float, Integer), - # array<extensos> se objecto for (Array, Range), - # hash<extensos> se objecto for (Hash) - def self.eo2e(obj) - # converte os valores do Hash nos seus extensos - if obj.is_a?(Hash) then obj.map { |k, v| [k, eo2e(v)] }.to_h - # converte objecto num Array com os valores convertidos em extensos - elsif obj.respond_to?(:to_a) then obj.to_a.map { |a| eo2e(a) } - else - # converte objeto em string digitos utilizando bigdecimal para - # evitar problemas com aritmetica virgula flutuante em valores >1e12 - # parametrizar parte inteira/fracionaria (@ai, @nf) da string digitos - epif(obj.to_d.to_s('F')) - - # processar extenso - valores >1e24 sao ignorados - @ai.count > 8 ? '' : etot(0, '') - end - end - - # Parametrizar moeda inferindo singular a partir do plural - # - # @param [Hash] moeda as opcoes para parametrizar moeda/fracao - # @option moeda [Symbol] :lc locale do extenso - - # portugues de portugal (:pt) portugues do brasil (:br) - # @option moeda [String] :msingular moeda no singular - - # inferido do plural menos"S" - # @option moeda [String] :fsingular fracao no singular - - # inferido do plural menos "S" - # @option moeda [String] :mplural moeda no plural - # @option moeda [String] :fplural fracao no plural - # @return [void] - def self.epsi(moeda) - @ms = moeda[:msingular] || - (moeda[:mplural].to_s[-1] == 'S' ? moeda[:mplural][0..-2] : 'EURO') - @cs = moeda[:fsingular] || - (moeda[:fplural].to_s[-1] == 'S' ? moeda[:fplural][0..-2] : 'CÊNTIMO') - end - - # Parametrizar moeda inferindo plural a partir do singular - # - # @param [Hash] moeda as opcoes para parametrizar moeda/fracao - # @option moeda [Symbol] :lc locale do extenso - - # portugues de portugal (:pt) portugues do brasil (:br) - # @option moeda [String] :msingular moeda no singular - # @option moeda [String] :fsingular fracao no singular - # @option moeda [String] :mplural moeda no plural - - # inferido do singular mais "S" - # @option moeda [String] :fplural fracao no plural - - # inferido do singular mais "S" - # @return [void] - def self.eppl(moeda) - # somente [:pt, :br] - @lc = EXTLC.include?(moeda[:lc]) ? moeda[:lc] : :pt - - @mp = moeda[:mplural] || @ms + 'S' - @cp = moeda[:fplural] || @cs + 'S' - end + # private_class_method :e900, :e090, :e009, :ef99, :efim, + # :edgs, :e124, :edg3 end