lib/extenso_pt/extenso.rb in extenso_pt-0.6.0 vs lib/extenso_pt/extenso.rb in extenso_pt-0.6.1

- old
+ new

@@ -1,38 +1,38 @@ # frozen_string_literal: true # @author Hernani Rodrigues Vaz module ExtensoPt - # Produz o extenso das centenas em portugues de portugal ou brasil + # Produz extenso das centenas em portugues de portugal ou brasil # # @param [Integer] mil o valor dum grupo 3 digitos a converter - # @return [String] o extenso das centenas + # @return [String] extenso das centenas def self.e900(mil) A1000[@lc][(mil > 100 ? 1 : 0) + mil / 100] + (mil > 100 && (mil % 100).positive? ? ' E ' : '') # proposicao end - # Produz o extenso das dezenas em portugues de portugal ou brasil + # Produz extenso das dezenas em portugues de portugal ou brasil # - # @param [Integer] cem o valor dum grupo 3 digitos a converter - # @return [String] o extenso das dezenas + # @param [Integer] cem a centena dum grupo 3 digitos a converter + # @return [String] extenso das dezenas def self.e090(cem) A0100[@lc][cem / 10] + (cem > 20 && (cem % 10).positive? ? ' E ' : '') # proposicao end - # Produz o extenso das unidades em portugues de portugal ou brasil + # Produz extenso das unidades em portugues de portugal ou brasil # - # @param [Integer] cem o valor dum grupo 3 digitos a converter - # @return [String] o extenso das unidades + # @param [Integer] cem a centena dum grupo 3 digitos a converter + # @return [String] extenso das unidades def self.e009(cem) A0020[@lc][cem < 20 ? cem : cem % 10] end - # Produz extenso parte fracionaria em portugues de portugal ou brasil + # Produz extenso da parte fracionaria em portugues de portugal ou brasil # - # @return [String] o extenso da parte fracionaria dum valor monetario + # @return [String] extenso da parte fracionaria def self.ef99 # parametrizacao por defeito @cs ||= 'CÊNTIMO' @cp ||= @ms + 'S' @@ -43,11 +43,11 @@ end end # Produz final da moeda em portugues de portugal ou brasil # - # @return [String] o final da moeda + # @return [String] final da moeda def self.efim # parametrizacao por defeito @ms ||= 'EURO' @mp ||= @ms + 'S' @@ -60,11 +60,11 @@ emo + (@tt.positive? && @nf.positive? ? ' E ' : '') + ef99 end # Produz separador entre grupos 3 digitos # - # @param [Integer] pos posicao actual nos grupos 3 digitos do valor monetario + # @param [Integer] pos posicao actual nos grupos 3 digitos # @return [String] separador entre grupos 3 digitos def self.edgs(pos) if pos.positive? && @ai[pos - 1].positive? @ai[pos - 1] > 100 ? ' ' : ' E ' else @@ -72,81 +72,81 @@ end end # Produz qualificador grupo de 3 digitos em portugues de portugal ou brasil # - # @param [Integer] pos posicao actual nos grupos 3 digitos do valor monetario + # @param [Integer] pos posicao actual nos grupos 3 digitos # @return [String] qualificador grupo de 3 digitos def self.e124(pos) if @ai[pos].positive? @ai[pos] > 1 ? P1E24[@lc][pos] : S1E24[@lc][pos] else '' - end + end + edgs(pos) end - # Produz extenso grupo 3 digitos em portugues de portugal ou brasil + # Produz extenso de grupo 3 digitos em portugues de portugal ou brasil # - # @param [Integer] pos posicao actual nos grupos 3 digitos do valor monetario + # @param [Integer] pos posicao actual nos grupos 3 digitos # @return [String] extenso grupo 3 digitos def self.edg3(pos) - # parametrizacao por defeito - # the first mention of an @<variable> creates the - # instance variable in the current object ie: self = ExtensoPt - @lc ||= :pt - - dg3 = if pos == 1 && @ai[pos] == 1 - # caso especial MIL EUROS - '' - else - e900(@ai[pos]) + e090(@ai[pos] % 100) + e009(@ai[pos] % 100) - end - # qualificador grupo de 3 digitos - dg3 + e124(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 # # @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 - @tt = @s6 + @m6 # proposicao E & singular/plural - @de = @s6.zero? && @m6.positive? # proposicao DE + # parametrizar controle de proposicao E & singular/plural + @tt = @s6 + @m6 + # parametrizar controle de proposicao DE + @de = @s6.zero? && @m6.positive? end - # Produz o extenso dum valor monetario em portugues de portugal ou brasil + # Produz extenso em portugues de portugal ou brasil # # @param [Integer] pos posicao actual nos grupos 3 digitos do valor monetario # @param [String] ext extenso em construcao # @return [String] o extenso dum valor monetario def self.etot(pos, ext) # testa fim do valor monetario if pos >= @ai.count - # parametrizar controle singular/plural & proposicoes + # parametrizar variaveis de controle epsp # caso especial zero (@tt + @nf).zero? ? 'ZERO ' + @mp : ext + efim else - # tratamento do proximo grupo 3 digitos - etot(pos + 1, edg3(pos) + edgs(pos) + ext) + # tratamento de grupo 3 digitos + etot(pos + 1, edg3(pos) + ext) end end - # Parametrizar parte inteira/fracionaria do valor monetario + # Parametrizar parte inteira/fracionaria da string digitos # # @param [String] digitos do valor monetario # @return [void] def self.epif(dig) - # parte inteira do valor monetario => array grupos 3 digitos + # 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 } - # parte fracionaria do valor monetario + # 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 @@ -157,30 +157,30 @@ # @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 - devolve um Hash + # converte os valores do Hash nos seus extensos if obj.is_a?(Hash) then obj.map { |k, v| [k, eo2e(v)] }.to_h - # converte o objecto num Array com os extensos dos valores + # 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) do valor monetario + # parametrizar parte inteira/fracionaria (@ai, @nf) da string digitos epif(obj.to_d.to_s('F')) - # processar extenso - valores >1e24 nao sao tratados + # 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 a moeda/fracao + # @param [Hash] moeda as opcoes para parametrizar moeda/fracao # @option moeda [Symbol] :lc locale do extenso - - # portugues de portugal (:pt) ou brasil (:br) + # 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 @@ -193,12 +193,12 @@ (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 a moeda/fracao + # @param [Hash] moeda as opcoes para parametrizar moeda/fracao # @option moeda [Symbol] :lc locale do extenso - - # portugues de portugal (:pt) ou brasil (:br) + # 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 -