lib/extenso_pt.rb in extenso_pt-0.7.2 vs lib/extenso_pt.rb in extenso_pt-0.7.3

- old
+ new

@@ -1,18 +1,22 @@ # frozen_string_literal: true require('bigdecimal/util') -require('extenso_pt/constantes') -require('extenso_pt/variaveis') require('extenso_pt/extenso') require('extenso_pt/romana') require('extenso_pt/version') # @author Hernani Rodrigues Vaz module ExtensoPt - class Error < StandardError; end - # Produz extenso em portugues de portugal ou brasil a partir de valor numerico + # expressao regular da numeracao romana + RO_RE = /^M*(D?C{0,3}|C[DM])(L?X{0,3}|X[LC])(V?I{0,3}|I[VX])$/i.freeze + # chaves parametrizacao moeda permitidas + MOEDA = %i[moeda_singular fracao_singular moeda_plural fracao_plural lc].freeze + # somente portugues de portugal ou brasil permitidos, qualquer outro locale equivale usar :pt + EXTLC = %i[pt br].freeze + + # Processa objeto criando extenso(s) em portugues de portugal ou brasil # # @note valor numerico pode ser uma string digitos # @param [Hash<String, Symbol>] moeda opcoes parametrizar moeda/fracao # @option moeda [Symbol] :lc locale do extenso - portugues de portugal (:pt) portugues do brasil (:br) # @option moeda [String] :moeda_singular moeda no singular @@ -23,72 +27,77 @@ # String<extenso> se objecto for (String, Float, Integer), # Array<extensos> se objecto for (Array, Range), # Hash<extensos> se objecto for (Hash) def extenso(moeda = { lc: :pt }) # parametrizar moeda - ExtensoPt.prmo(moeda.parametrizar) + ExtensoPt.parametrizar_moeda(moeda.parametrizar) processa end - # Processa objeto criando extenso(s) em portugues de portugal ou brasil - # - # @return (see #extenso) - def processa - # converte valores do Hash nos seus extensos - if is_a?(Hash) then transform_values(&:processa) - # converte objecto num Array com os valores convertidos nos seus extensos - elsif respond_to?(:to_a) then to_a.map(&:processa) - else - # converte objeto em string digitos utilizando bigdecimal para - # evitar problemas com aritmetica virgula flutuante em valores >1e12 - # valores negativos sao convertidos em positivos - # parametrizar parte inteira/fracionaria (@ai, @nf) da string digitos - ExtensoPt.prif(to_d.abs.to_s('F')) - - # processar extenso - valores >= 1e24 sao ignorados - ExtensoPt.cvai.count > 8 ? '' : ExtensoPt.ejun - end - end - # @return [Hash<String, Symbol>] parametrizacao moeda por defeito para :br & inferencias & errados def parametrizar - if value?(:br) && %i[moeda_singular moeda_plural].all? { |e| !keys.include?(e) } + if value?(:br) && %i[moeda_singular moeda_plural].all? { |syb| !keys.include?(syb) } { lc: :br, moeda_singular: 'REAL', moeda_plural: 'REAIS', fracao_singular: 'CENTAVO', fracao_plural: 'CENTAVOS' } else inferir_singular.eliminar_errados end end # @return [Hash<String, Symbol>] parametrizacao moeda singular inferindo do plural def inferir_singular - self[:moeda_singular] ||= (fetch(:moeda_plural, '')[0..-2] if fetch(:moeda_plural, '')[-1] == 'S') - self[:fracao_singular] ||= (fetch(:fracao_plural, '')[0..-2] if fetch(:fracao_plural, '')[-1] == 'S') + mdp = fetch(:moeda_plural, '') + frp = fetch(:fracao_plural, '') + self[:moeda_singular] ||= (mdp[0..-2] if mdp[-1] == 'S') + self[:fracao_singular] ||= (frp[0..-2] if frp[-1] == 'S') self end # @return [Hash<String, Symbol>] parametrizacao moeda eliminar parametros errados def eliminar_errados - keep_if { |k, v| MOEDA.include?(k) && (k != :lc || EXTLC.include?(v)) } + keep_if { |key, val| MOEDA.include?(key) && (key != :lc || EXTLC.include?(val)) } end - # @return [true, false] testa se contem numeracao romana - def romana? - is_a?(String) ? RO_RE.match?(upcase) : false + # @return (see #extenso) + def processa + # converte num Array com os valores convertidos nos seus extensos + return to_a.map(&:processa) if is_a?(Range) || is_a?(Array) + # converte valores do Hash nos seus extensos + return transform_values(&:processa) if is_a?(Hash) + + # converte objeto em string digitos utilizando bigdecimal para + # evitar problemas com aritmetica virgula flutuante em valores >1e12 + # valores negativos sao convertidos em positivos + # parametrizar parte inteira/fracionaria (@ai, @nf) da string digitos + ExtensoPt.parametrizar_grupos(to_d.abs.to_s('F')) + + # processar extenso - valores >= 1e24 sao ignorados + ExtensoPt.grupos.count > 8 ? '' : ExtensoPt.extenso_completo end # @note valor numerico pode ser uma string digitos # @return [String, Integer] numeracao romana a partir de numerico ou inteiro a partir da numeracao romana def romana + # converte num Array com os valores convertidos + return to_a.map(&:romana) if is_a?(Range) || is_a?(Array) # converte os valores do Hash - if is_a?(Hash) then transform_values(&:romana) - # converte objecto num Array com os valores convertidos - elsif respond_to?(:to_a) then to_a.map(&:romana) + return transform_values(&:romana) if is_a?(Hash) + + romana_base(to_i.abs) + end + + # @return (see #romana) + def romana_base(inteiro) # numeracao romana a partir de inteiro ou string digitos (ignora parte fracionaria & negativos) - elsif (inteiro = to_i) != 0 then ExtensoPt.ri2r(inteiro.abs) + return ExtensoPt.ri2r(inteiro) unless inteiro.zero? + # inteiro a partir da numeracao romana - else RO_RE.match?(to_s) ? ExtensoPt.rr2i(upcase, 0) : '' - end + RO_RE.match?(to_s) ? ExtensoPt.rr2i(upcase, 0) : '' + end + + # @return [true, false] testa se contem numeracao romana + def romana? + is_a?(String) ? RO_RE.match?(upcase) : false end end # converter Hash class Hash; include ExtensoPt; end