extenso_pt 0.6.10 → 0.7.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bb2aa36a643f3c97bdfe6e764eff21ea72272ef3467fd189f4002cdbc358ca88
4
- data.tar.gz: c2bbd4be8c8e720335d8382b216961d5ada3d1ecff4d52947e802bd0571a1283
3
+ metadata.gz: 60c6fc6aeadb5973a9f9d9b59a2f92a8343c4d4e72dd5ac20d4fe70489022805
4
+ data.tar.gz: 16f3545f8a2a36a14d039c5b92a2f02da487c4f4eef6614ca2d06a83e93d7f3f
5
5
  SHA512:
6
- metadata.gz: e9fb8e35fc9c4622dcee0bc48423c886e42a8072718d73fe33bcf7ede0874db91d8f31a4d3a4eae25fa2c328dde871babb823ba183cb5194772bd55daeee3151
7
- data.tar.gz: 2180b22b4bef23cb4129521706fa109b149bc01f459f0bf1c23fc6ad10b9943731d2aab1880078f70db1e9f25ceacebbd83b846b39eef3854ed716c4e020f55f
6
+ metadata.gz: 1edbcbaf07ff510ab740dcd228a3616a18c9e1e4e54b664254eb24ffa34086b2a975f250b5a48a57f226c1346d75e5d7d826ed996ee44a95192716a01e47e482
7
+ data.tar.gz: 4f64f33054298180070746a3c110bc29e40a2513418be0744c0d9074bcebe9245d68f3047b68897e5c2d48d198c4f35f5e78d9a438a4f2c4d881384aea74fdcd
@@ -0,0 +1,12 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.7
3
+ EnabledByDefault: true
4
+
5
+ Style/Copyright:
6
+ Enabled: false
7
+
8
+ Lint/ConstantResolution:
9
+ Enabled: false
10
+
11
+ Style/ConstantVisibility:
12
+ Enabled: false
@@ -1,24 +1,24 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- extenso_pt (0.6.10)
5
- bigdecimal (~> 1.4)
4
+ extenso_pt (0.7.2)
5
+ bigdecimal
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- bigdecimal (1.4.4)
11
- minitest (5.13.0)
12
- rake (10.5.0)
10
+ bigdecimal (2.0.0)
11
+ minitest (5.14.1)
12
+ rake (13.0.1)
13
13
 
14
14
  PLATFORMS
15
15
  ruby
16
16
 
17
17
  DEPENDENCIES
18
- bundler (~> 1.17)
18
+ bundler
19
19
  extenso_pt!
20
- minitest (~> 5.0)
21
- rake (~> 10.0)
20
+ minitest
21
+ rake
22
22
 
23
23
  BUNDLED WITH
24
- 1.17.2
24
+ 2.1.4
@@ -2,7 +2,7 @@
2
2
 
3
3
  lib = File.expand_path('lib', __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
- require 'extenso_pt/version'
5
+ require('extenso_pt/version')
6
6
 
7
7
  Gem::Specification.new do |spec|
8
8
  spec.name = 'extenso_pt'
@@ -12,31 +12,29 @@ Gem::Specification.new do |spec|
12
12
  spec.homepage = 'https://github.com/hernanilr/extenso_pt'
13
13
  spec.license = 'MIT'
14
14
 
15
- spec.summary = 'Produz extenso em portugês de portugal, brasil '\
16
- 'ou numeracao romana.'
15
+ spec.summary = 'Produz extenso em portugês de portugal, brasil ou numeracao romana.'
17
16
  spec.description = spec.summary
18
- spec.description += ' Os valores podem ser um numerico, uma string de '\
19
- 'digitos ou um conjunto destes agrupados em (array, range, hash). '\
20
- 'O extenso pode ser produzido na escala longa (utilizada em todos os '\
21
- 'países lusófonos) ou na escala curta (utilizada no Brasil). Pode ainda '\
22
- 'produzir numeracao romana e vice versa.'
17
+ spec.description += ' Os valores podem ser um numerico, uma string de digitos ou um conjunto destes agrupados em '\
18
+ '(array, range, hash). O extenso pode ser produzido na escala longa (utilizada em todos os países lusófonos) ou '\
19
+ 'na escala curta (utilizada no Brasil). Pode ainda produzir numeracao romana e vice versa.'
23
20
 
24
- spec.metadata['yard.run'] = 'yard' # use "yard" to build full HTML docs.
21
+ # use "yard" to build full HTML docs.
22
+ spec.metadata['yard.run'] = 'yard'
25
23
  spec.metadata['homepage_uri'] = spec.homepage
26
24
 
27
25
  # Specify which files should be added to the gem when it is released.
28
26
  # loads the files in the RubyGem that have been added into git.
29
- spec.files = Dir.chdir(File.expand_path(__dir__)) do
30
- `git ls-files -z`.split("\x0").reject \
31
- { |f| f.match(%r{^(test|spec|features)/}) }
32
- end
27
+ spec.files =
28
+ Dir.chdir(File.expand_path(__dir__)) do
29
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
30
+ end
33
31
  spec.bindir = 'exe'
34
32
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
35
33
  spec.require_paths = ['lib']
36
34
 
37
- spec.add_development_dependency 'bundler', '~> 1.17'
38
- spec.add_development_dependency 'minitest', '~> 5.0'
39
- spec.add_development_dependency 'rake', '~> 10.0'
35
+ spec.add_development_dependency('bundler')
36
+ spec.add_development_dependency('minitest')
37
+ spec.add_development_dependency('rake')
40
38
 
41
- spec.add_dependency 'bigdecimal', '~> 1.4'
39
+ spec.add_dependency('bigdecimal')
42
40
  end
@@ -1,21 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'bigdecimal/util'
4
- require 'extenso_pt/constantes'
5
- require 'extenso_pt/variaveis'
6
- require 'extenso_pt/extenso'
7
- require 'extenso_pt/romana'
8
- require 'extenso_pt/version'
3
+ require('bigdecimal/util')
4
+ require('extenso_pt/constantes')
5
+ require('extenso_pt/variaveis')
6
+ require('extenso_pt/extenso')
7
+ require('extenso_pt/romana')
8
+ require('extenso_pt/version')
9
9
 
10
10
  # @author Hernani Rodrigues Vaz
11
11
  module ExtensoPt
12
12
  class Error < StandardError; end
13
- # Produz extenso em portugues de portugal ou brasil
14
- # (valor numerico pode ser uma string digitos)
13
+ # Produz extenso em portugues de portugal ou brasil a partir de valor numerico
15
14
  #
15
+ # @note valor numerico pode ser uma string digitos
16
16
  # @param [Hash<String, Symbol>] moeda opcoes parametrizar moeda/fracao
17
- # @option moeda [Symbol] :lc locale do extenso -
18
- # portugues de portugal (:pt) portugues do brasil (:br)
17
+ # @option moeda [Symbol] :lc locale do extenso - portugues de portugal (:pt) portugues do brasil (:br)
19
18
  # @option moeda [String] :moeda_singular moeda no singular
20
19
  # @option moeda [String] :fracao_singular fracao no singular
21
20
  # @option moeda [String] :moeda_plural moeda no plural
@@ -33,73 +32,59 @@ module ExtensoPt
33
32
 
34
33
  # Processa objeto criando extenso(s) em portugues de portugal ou brasil
35
34
  #
36
- # @return [String, Array<String>, Hash<String>]
37
- # String<extenso> se objecto for (String, Float, Integer),
38
- # Array<extensos> se objecto for (Array, Range),
39
- # Hash<extensos> se objecto for (Hash)
35
+ # @return (see #extenso)
40
36
  def processa
41
37
  # converte valores do Hash nos seus extensos
42
- if is_a?(Hash) then map { |k, v| [k, v.processa] }.to_h
38
+ if is_a?(Hash) then transform_values(&:processa)
43
39
  # converte objecto num Array com os valores convertidos nos seus extensos
44
40
  elsif respond_to?(:to_a) then to_a.map(&:processa)
45
41
  else
46
42
  # converte objeto em string digitos utilizando bigdecimal para
47
43
  # evitar problemas com aritmetica virgula flutuante em valores >1e12
44
+ # valores negativos sao convertidos em positivos
48
45
  # parametrizar parte inteira/fracionaria (@ai, @nf) da string digitos
49
- ExtensoPt.prif(to_d.to_s('F'))
46
+ ExtensoPt.prif(to_d.abs.to_s('F'))
50
47
 
51
- # processar extenso - valores >1e24 sao ignorados
48
+ # processar extenso - valores >= 1e24 sao ignorados
52
49
  ExtensoPt.cvai.count > 8 ? '' : ExtensoPt.ejun
53
50
  end
54
51
  end
55
52
 
56
- # Parametrizacao por defeito para :br
57
- #
58
- # @return [Hash<String, Symbol>] parametrizacao moeda
53
+ # @return [Hash<String, Symbol>] parametrizacao moeda por defeito para :br & inferencias & errados
59
54
  def parametrizar
60
- if value?(:br) &&
61
- %i[moeda_singular moeda_plural].all? { |e| !keys.include?(e) }
62
- { lc: :br, moeda_singular: 'REAL', moeda_plural: 'REAIS',
63
- fracao_singular: 'CENTAVO', fracao_plural: 'CENTAVOS' }
55
+ if value?(:br) && %i[moeda_singular moeda_plural].all? { |e| !keys.include?(e) }
56
+ { lc: :br, moeda_singular: 'REAL', moeda_plural: 'REAIS', fracao_singular: 'CENTAVO', fracao_plural: 'CENTAVOS' }
64
57
  else
65
- inferir_singular
58
+ inferir_singular.eliminar_errados
66
59
  end
67
60
  end
68
61
 
69
- # Parametrizacao singular inferindo do plural
70
- #
71
- # @return [Hash<String, Symbol>] parametrizacao moeda
62
+ # @return [Hash<String, Symbol>] parametrizacao moeda singular inferindo do plural
72
63
  def inferir_singular
73
- self[:moeda_singular] ||= if fetch(:moeda_plural, '')[-1] == 'S'
74
- fetch(:moeda_plural, '')[0..-2]
75
- end
76
- self[:fracao_singular] ||= if fetch(:fracao_plural, '')[-1] == 'S'
77
- fetch(:fracao_plural, '')[0..-2]
78
- end
79
- # eliminar parametros errados
64
+ self[:moeda_singular] ||= (fetch(:moeda_plural, '')[0..-2] if fetch(:moeda_plural, '')[-1] == 'S')
65
+ self[:fracao_singular] ||= (fetch(:fracao_plural, '')[0..-2] if fetch(:fracao_plural, '')[-1] == 'S')
66
+ self
67
+ end
68
+
69
+ # @return [Hash<String, Symbol>] parametrizacao moeda eliminar parametros errados
70
+ def eliminar_errados
80
71
  keep_if { |k, v| MOEDA.include?(k) && (k != :lc || EXTLC.include?(v)) }
81
72
  end
82
73
 
83
- # Testa se contem numeracao romana
84
- #
85
- # @return [true, false] sim ou nao numeracao romana
74
+ # @return [true, false] testa se contem numeracao romana
86
75
  def romana?
87
76
  is_a?(String) ? RO_RE.match?(upcase) : false
88
77
  end
89
78
 
90
- # Produz numeracao romana a partir de valor numerico
91
- # ou valor numerico a partir da numeracao romana
92
- # (valor numerico pode ser uma string digitos)
93
- #
94
- # @return [String, Integer] numeracao romana ou valor numerico
79
+ # @note valor numerico pode ser uma string digitos
80
+ # @return [String, Integer] numeracao romana a partir de numerico ou inteiro a partir da numeracao romana
95
81
  def romana
96
82
  # converte os valores do Hash
97
- if is_a?(Hash) then map { |k, v| [k, v.romana] }.to_h
83
+ if is_a?(Hash) then transform_values(&:romana)
98
84
  # converte objecto num Array com os valores convertidos
99
85
  elsif respond_to?(:to_a) then to_a.map(&:romana)
100
- # numeracao romana a partir de inteiro ou string digitos
101
- # (ignora parte fracionaria)
102
- elsif (inteiro = to_i) != 0 then ExtensoPt.ri2r(inteiro)
86
+ # numeracao romana a partir de inteiro ou string digitos (ignora parte fracionaria & negativos)
87
+ elsif (inteiro = to_i) != 0 then ExtensoPt.ri2r(inteiro.abs)
103
88
  # inteiro a partir da numeracao romana
104
89
  else RO_RE.match?(to_s) ? ExtensoPt.rr2i(upcase, 0) : ''
105
90
  end
@@ -3,37 +3,33 @@
3
3
  # @author Hernani Rodrigues Vaz
4
4
  module ExtensoPt
5
5
  # chaves parametrizacao moeda permitidas
6
- MOEDA = %i[moeda_singular fracao_singular
7
- moeda_plural fracao_plural lc].freeze
8
- # somente portugues de portugal ou brasil permitidos
9
- # qualquer outro locale equivale usar :pt
6
+ MOEDA = %i[moeda_singular fracao_singular moeda_plural fracao_plural lc].freeze
7
+
8
+ # somente portugues de portugal ou brasil permitidos, qualquer outro locale equivale usar :pt
10
9
  EXTLC = %i[pt br].freeze
10
+
11
+ E13 = %w[UM DOIS TRÊS QUATRO CINCO SEIS SETE OITO NOVE DEZ ONZE DOZE TREZE].freeze
12
+
11
13
  # extensos 1 ate 19
12
14
  A0020 = {
13
- pt: ['', 'UM', 'DOIS', 'TRÊS', 'QUATRO', 'CINCO', 'SEIS', 'SETE',
14
- 'OITO', 'NOVE', 'DEZ', 'ONZE', 'DOZE', 'TREZE', 'CATORZE',
15
- 'QUINZE', 'DEZASSEIS', 'DEZASSETE', 'DEZOITO', 'DEZANOVE'],
16
- br: ['', 'UM', 'DOIS', 'TRES', 'QUATRO', 'CINCO', 'SEIS', 'SETE',
17
- 'OITO', 'NOVE', 'DEZ', 'ONZE', 'DOZE', 'TREZE', 'QUATORZE',
18
- 'QUINZE', 'DEZESSEIS', 'DEZESSETE', 'DEZOITO', 'DEZENOVE']
15
+ pt: [''] + E13 + %w[CATORZE QUINZE DEZASSEIS DEZASSETE DEZOITO DEZANOVE],
16
+ br: [''] + E13 + %w[QUATORZE QUINZE DEZESSEIS DEZESSETE DEZOITO DEZENOVE]
19
17
  }.freeze
18
+
20
19
  # extensos 20 ate 90
21
20
  A0100 = {
22
- pt: ['', '', 'VINTE', 'TRINTA', 'QUARENTA', 'CINQUENTA', 'SESSENTA',
23
- 'SETENTA', 'OITENTA', 'NOVENTA'],
24
- br: ['', '', 'VINTE', 'TRINTA', 'QUARENTA', 'CINQUENTA', 'SESSENTA',
25
- 'SETENTA', 'OITENTA', 'NOVENTA']
21
+ pt: ['', ''] + %w[VINTE TRINTA QUARENTA CINQUENTA SESSENTA SETENTA OITENTA NOVENTA],
22
+ br: ['', ''] + %w[VINTE TRINTA QUARENTA CINQUENTA SESSENTA SETENTA OITENTA NOVENTA]
26
23
  }.freeze
24
+
27
25
  # extensos 100 ate 900
28
26
  A1000 = {
29
- pt: ['', 'CEM', 'CENTO', 'DUZENTOS', 'TREZENTOS', 'QUATROCENTOS',
30
- 'QUINHENTOS', 'SEISCENTOS', 'SETECENTOS', 'OITOCENTOS', 'NOVECENTOS'],
31
- br: ['', 'CEM', 'CENTO', 'DUZENTOS', 'TREZENTOS', 'QUATROCENTOS',
32
- 'QUINHENTOS', 'SEISCENTOS', 'SETECENTOS', 'OITOCENTOS', 'NOVECENTOS']
27
+ pt: [''] + %w[CEM CENTO DUZENTOS TREZENTOS QUATROCENTOS QUINHENTOS SEISCENTOS SETECENTOS OITOCENTOS NOVECENTOS],
28
+ br: [''] + %w[CEM CENTO DUZENTOS TREZENTOS QUATROCENTOS QUINHENTOS SEISCENTOS SETECENTOS OITOCENTOS NOVECENTOS]
33
29
  }.freeze
34
30
 
35
31
  # singular extensos 1e3 ate 1e24
36
- # escala segundo convencao entre varios paises,
32
+ # @note escala segundo convencao entre varios paises,
37
33
  # na 9a Conferencia Geral de Pesos e Medidas (12-21 de Outubro de 1948),
38
34
  # organizada pelo Bureau International des Poids et Mesures
39
35
  # @example
@@ -43,24 +39,23 @@ module ExtensoPt
43
39
  # 1 000 000 000 000 000 000 000 000 = quadriliao
44
40
  # 1 000 000 000 000 000 000 000 000 000 000 = quintiliao
45
41
  # 1 000 000 000 000 000 000 000 000 000 000 000 000 = sextiliao
46
- S1E24 = { pt: ['', 'MIL', ' MILHÃO', ' MIL MILHÃO', ' BILIÃO',
47
- ' MIL BILIÃO', ' TRILIÃO', ' MIL TRILIÃO'],
48
- br: ['', 'MIL', ' MILHÃO', ' BILHÃO', ' TRILHÃO',
49
- ' QUADRILHÃO', ' QUINTILHÃO', ' SEXTILHÃO'] }.freeze
42
+ S1E24 = {
43
+ pt: ['', 'MIL', ' MILHÃO', ' MIL MILHÃO', ' BILIÃO', ' MIL BILIÃO', ' TRILIÃO', ' MIL TRILIÃO'],
44
+ br: ['', 'MIL', ' MILHÃO', ' BILHÃO', ' TRILHÃO', ' QUADRILHÃO', ' QUINTILHÃO', ' SEXTILHÃO']
45
+ }.freeze
46
+
50
47
  # plural extensos 1e3 ate 1e24
51
- P1E24 = { pt: ['', ' MIL', ' MILHÕES', ' MIL MILHÕES', ' BILIÕES',
52
- ' MIL BILIÕES', ' TRILIÕES', ' MIL TRILIÕES'],
53
- br: ['', ' MIL', ' MILHÕES', ' BILHÕES', ' TRILHÕES',
54
- ' QUADRILHÕES', ' QUINTILHÕES', ' SEXTILHÕES'] }.freeze
48
+ # @note escala segundo convencao entre varios paises,
49
+ # na 9a Conferencia Geral de Pesos e Medidas (12-21 de Outubro de 1948),
50
+ # organizada pelo Bureau International des Poids et Mesures
51
+ P1E24 = {
52
+ pt: ['', ' MIL', ' MILHÕES', ' MIL MILHÕES', ' BILIÕES', ' MIL BILIÕES', ' TRILIÕES', ' MIL TRILIÕES'],
53
+ br: ['', ' MIL', ' MILHÕES', ' BILHÕES', ' TRILHÕES', ' QUADRILHÕES', ' QUINTILHÕES', ' SEXTILHÕES']
54
+ }.freeze
55
+
56
+ # numeracao romana ordem decrescente (ordem importante)
57
+ ROMAN = { M: 1000, CM: 900, D: 500, CD: 400, C: 100, XC: 90, L: 50, XL: 40, X: 10, IX: 9, V: 5, IV: 4, I: 1 }.freeze
55
58
 
56
- # numeracao romana
57
- ROMAN = { M: 1000, CM: 900,
58
- D: 500, CD: 400,
59
- C: 100, XC: 90,
60
- L: 50, XL: 40,
61
- X: 10, IX: 9,
62
- V: 5, IV: 4,
63
- I: 1 }.freeze
64
- # exprecao regular da numeracao romana
59
+ # expressao regular da numeracao romana
65
60
  RO_RE = /^M*(D?C{0,3}|C[DM])(L?X{0,3}|X[LC])(V?I{0,3}|I[VX])$/i.freeze
66
61
  end
@@ -7,8 +7,7 @@ module ExtensoPt
7
7
  # @param [Integer] mil o valor dum grupo 3 digitos a converter
8
8
  # @return [String] extenso das centenas
9
9
  def self.e900(mil)
10
- A1000[@lc][(mil > 100 ? 1 : 0) + mil / 100] +
11
- (mil > 100 && (mil % 100).positive? ? ' E ' : '')
10
+ A1000[@lc][(mil > 100 ? 1 : 0) + mil / 100] + (mil > 100 && (mil % 100).positive? ? ' E ' : '')
12
11
  end
13
12
 
14
13
  # Produz extenso das dezenas em portugues de portugal ou brasil
@@ -16,8 +15,7 @@ module ExtensoPt
16
15
  # @param [Integer] cem a centena dum grupo 3 digitos a converter
17
16
  # @return [String] extenso das dezenas
18
17
  def self.e090(cem)
19
- A0100[@lc][cem / 10] +
20
- (cem > 20 && (cem % 10).positive? ? ' E ' : '')
18
+ A0100[@lc][cem / 10] + (cem > 20 && (cem % 10).positive? ? ' E ' : '')
21
19
  end
22
20
 
23
21
  # Produz extenso das unidades em portugues de portugal ou brasil
@@ -28,9 +26,7 @@ module ExtensoPt
28
26
  A0020[@lc][cem < 20 ? cem : cem % 10]
29
27
  end
30
28
 
31
- # Produz extenso da parte fracionaria em portugues de portugal ou brasil
32
- #
33
- # @return [String] extenso da parte fracionaria
29
+ # @return [String] extenso da parte fracionaria em portugues de portugal ou brasil
34
30
  def self.ef99
35
31
  if cnf?
36
32
  e090(@nf) + e009(@nf) + ' ' + (@nf > 1 ? @fp : @fs)
@@ -39,25 +35,21 @@ module ExtensoPt
39
35
  end
40
36
  end
41
37
 
42
- # Produz final da moeda em portugues de portugal ou brasil
43
- #
44
- # @return [String] final da moeda
38
+ # @return [String] final da moeda em portugues de portugal ou brasil
45
39
  def self.efim
46
40
  t = c124
47
41
  if t.positive?
48
- # proposicao DE entre parte inteira e moeda
49
- # moeda singular/plural
50
- # proposicao E entre moeda e parte fracionaria
42
+ # proposicao DE entre parte inteira e moeda & moeda singular/plural & proposicao E entre moeda e parte fracionaria
51
43
  (cde? ? ' DE ' : ' ') + (t > 1 ? @mp : @ms) + (cnf? ? ' E ' : '')
52
44
  else
53
45
  ''
54
46
  end + ef99
55
47
  end
56
48
 
57
- # Produz separador entre grupos 3 digitos
49
+ # Produz proposicao E entre grupos 3 digitos
58
50
  #
59
51
  # @param [Integer] pos posicao actual nos grupos 3 digitos
60
- # @return [String] separador entre grupos 3 digitos
52
+ # @return [String] proposicao E entre grupos 3 digitos
61
53
  def self.edgs(pos)
62
54
  if pos.positive? && @ai[pos - 1].positive?
63
55
  @ai[pos - 1] > 100 ? ' ' : ' E '
@@ -87,6 +79,7 @@ module ExtensoPt
87
79
  if pos == 1 && @ai[pos] == 1
88
80
  ''
89
81
  else
82
+ # extenso das centenas + extenso das dezenas + extenso das unidades
90
83
  e900(@ai[pos]) + e090(@ai[pos] % 100) + e009(@ai[pos] % 100)
91
84
  end + e124(pos)
92
85
  end
@@ -102,8 +95,7 @@ module ExtensoPt
102
95
  # caso especial de zero
103
96
  (c124 + @nf).zero? ? 'ZERO ' + @mp : ext + efim
104
97
  else
105
- # converte grupo 3 digitos na posicao corrente
106
- # envoca proxima posicao
98
+ # converte grupo 3 digitos na posicao corrente & envoca proxima posicao
107
99
  ejun(pos + 1, edg3(pos) + ext)
108
100
  end
109
101
  end
@@ -9,9 +9,9 @@ module ExtensoPt
9
9
  def self.ri2r(inteiro)
10
10
  return '' if inteiro.zero?
11
11
 
12
- # numeracao romana nao tem negativos
13
- inteiro = inteiro.abs if inteiro.negative?
14
- ROMAN.each { |r, v| return r.to_s + ri2r(inteiro - v) if v <= inteiro }
12
+ ROMAN.each do |r, v|
13
+ return r.to_s + ri2r(inteiro - v) if v <= inteiro
14
+ end
15
15
  end
16
16
 
17
17
  # Produz inteiro a partir de numeral romano
@@ -23,6 +23,6 @@ module ExtensoPt
23
23
  return 0 if numeral.empty?
24
24
 
25
25
  v = ROMAN[numeral[-1].to_sym]
26
- v < ultimo ? (rr2i(numeral.chop, v) - v) : (rr2i(numeral.chop, v) + v)
26
+ rr2i(numeral.chop, v) + (v < ultimo ? -v : v)
27
27
  end
28
28
  end
@@ -2,19 +2,17 @@
2
2
 
3
3
  # @author Hernani Rodrigues Vaz
4
4
  module ExtensoPt
5
- # Parametrizar moeda
5
+ # Parametrizar variaveis da moeda
6
6
  #
7
7
  # @param [Hash<String, Symbol>] moeda opcoes parametrizar moeda/fracao
8
- # @option moeda [Symbol] :lc locale do extenso -
9
- # portugues de portugal (:pt) portugues do brasil (:br)
8
+ # @option moeda [Symbol] :lc locale do extenso - portugues de portugal (:pt) portugues do brasil (:br)
10
9
  # @option moeda [String] :moeda_singular moeda no singular
11
10
  # @option moeda [String] :fracao_singular fracao no singular
12
11
  # @option moeda [String] :moeda_plural moeda no plural
13
12
  # @option moeda [String] :fracao_plural fracao no plural
14
13
  def self.prmo(moeda)
15
14
  # parametrizacao por defeito
16
- # the first mention of a @<variable> creates that instance variable
17
- # in the current object ie: self = ExtensoPt
15
+ # the first mention of a @<variable> creates that instance variable in the current object ie: self = ExtensoPt
18
16
  @lc = moeda[:lc] || :pt
19
17
  @ms = moeda[:moeda_singular] || 'EURO'
20
18
  @fs = moeda[:fracao_singular] || 'CÊNTIMO'
@@ -22,19 +20,15 @@ module ExtensoPt
22
20
  @fp = moeda[:fracao_plural] || @fs + 'S'
23
21
  end
24
22
 
25
- # Parametrizar parte inteira e fracionaria
23
+ # Parametrizar variaveis parte inteira e fracionaria
26
24
  #
27
25
  # @param [String] digitos do valor monetario a converter
28
26
  def self.prif(digitos)
29
- # cria array de grupos 3 digitos da parte inteira
30
- # ex: 123022.12 => [22, 123]
31
- @ai = digitos[/^\d+/].to_s.reverse.scan(/\d{1,3}/)
32
- .map { |i| i.reverse.to_i }
27
+ # cria array de grupos 3 digitos da parte inteira ex: 123022.12 => [22, 123]
28
+ @ai = digitos[/^\d+/].reverse.scan(/\d{1,3}/).map { |i| Integer(i.reverse) }
33
29
 
34
- # obtem parte fracionaria da string digitos
35
- # ex: 123022.12 => 12
36
- # arredondada a 2 casas decimais (centimos/centavos)
37
- @nf = (digitos[/\.\d*/].to_f * 100).round
30
+ # obtem parte fracionaria da string digitos arredondada a 2 casas decimais ex: 123022.124 => 12, 123022.125 => 13
31
+ @nf = (Float(digitos[/\.\d*/]) * 100).round
38
32
  end
39
33
 
40
34
  # @return [Array<Integer>] grupos 3 digitos da parte inteira
@@ -44,13 +38,12 @@ module ExtensoPt
44
38
 
45
39
  # @return [Integer] soma grupos 1-8 de digitos
46
40
  def self.c124
47
- @ai[0].to_i + @ai[1].to_i * 2 + @ai[2..-1].to_a.inject(:+).to_i * 2
41
+ Integer(@ai[0]) + Integer(@ai[1] || 0) * 2 + Integer(@ai[2..].to_a.inject(:+) || 0) * 2
48
42
  end
49
43
 
50
44
  # @return [true, false] sim ou nao para controle proposicao DE
51
45
  def self.cde?
52
- @ai[0..1].to_a.inject(:+).to_i.zero? &&
53
- @ai[2..-1].to_a.inject(:+).to_i.positive?
46
+ Integer(@ai[0..1].inject(:+)).zero? && Integer(@ai[2..].to_a.inject(:+) || 0).positive?
54
47
  end
55
48
 
56
49
  # @return [true, false] sim ou nao para controle proposicao E
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ExtensoPt
4
- VERSION = '0.6.10'
4
+ VERSION = '0.7.2'
5
5
  end
metadata CHANGED
@@ -1,71 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: extenso_pt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.10
4
+ version: 0.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hernâni Rodrigues Vaz
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-01-05 00:00:00.000000000 Z
11
+ date: 2020-08-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.17'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.17'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: minitest
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '5.0'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '5.0'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '10.0'
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '10.0'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: bigdecimal
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '1.4'
61
+ version: '0'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '1.4'
68
+ version: '0'
69
69
  description: Produz extenso em portugês de portugal, brasil ou numeracao romana. Os
70
70
  valores podem ser um numerico, uma string de digitos ou um conjunto destes agrupados
71
71
  em (array, range, hash). O extenso pode ser produzido na escala longa (utilizada
@@ -79,6 +79,7 @@ extra_rdoc_files: []
79
79
  files:
80
80
  - ".gitignore"
81
81
  - ".project_alt.json"
82
+ - ".rubocop.yml"
82
83
  - ".travis.yml"
83
84
  - Gemfile
84
85
  - Gemfile.lock
@@ -115,7 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
115
116
  - !ruby/object:Gem::Version
116
117
  version: '0'
117
118
  requirements: []
118
- rubygems_version: 3.0.3
119
+ rubygems_version: 3.1.2
119
120
  signing_key:
120
121
  specification_version: 4
121
122
  summary: Produz extenso em portugês de portugal, brasil ou numeracao romana.