extenso_pt 0.5.3 → 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 10ea3b7fbc48b315312ba6ff3a297884a7eb715bbee0e5b0ff1332672fe66be8
4
- data.tar.gz: 77f82a40052f904705bf3fa6e0ffc328006ef22c837fa11fe279317312783a9d
3
+ metadata.gz: 8d41d1cbf7468f74a1287b15d53fbe72624afeeb06bf4027bc51d5676e81fceb
4
+ data.tar.gz: ae4028347d25170b32a123bdab5cb260d0be01aadb32a266d9131adf8bd911c3
5
5
  SHA512:
6
- metadata.gz: 7a1756b097562327fb5540533ec05a1bba78d1d2614106fc33690b276fc05274c899158c28c81169c165d0414dfd927423a3612421c72a769ccef9ee553c09ec
7
- data.tar.gz: 6f9be8e11f8db30bbaedc8ff1e372e665e8d11fdcf160c0bff2563436b7a1963ecc44d5df2236401ad95b408862b65d7ad6736691780c1fd9ceaadba6a4ccaae
6
+ metadata.gz: 90362000feecf288a7318275fca0d59c27a07ed7fa50ba0b9d7e6d36b0ed8518ed690314d1da97df440f1da306683465f8effa88622743e149125315845314fe
7
+ data.tar.gz: 1cd11787676cf949a8f93edb2cc06c79d1b7a3a7b97b76e67f69488acd721a151aea87fb80ce26b5102a757ebb5bccadc52d008958cf2c7997d83626a873cae4
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- extenso_pt (0.5.3)
4
+ extenso_pt (0.5.4)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/extenso_pt.gemspec CHANGED
@@ -9,23 +9,26 @@ Gem::Specification.new do |spec|
9
9
  spec.version = ExtensoPt::VERSION
10
10
  spec.authors = ['Hernâni Rodrigues Vaz']
11
11
  spec.email = ['hernanirvaz@gmail.com']
12
-
13
- spec.summary = 'Produz valores monetários por extenso em portugês de portugal ou brasil.'
14
- spec.description = spec.summary + ' Os valores podem ser um numerico, uma string de digitos ou um conjunto destes (array, range, hash). O extenso pode ser produzido na escala longa (utilizada em todos os países lusófonos) ou na escala curta (utilizada no Brasil). Pode ainda escolher a moeda e a fração da moeda.'
15
-
16
12
  spec.homepage = 'https://github.com/hernanilr/extenso_pt'
17
13
  spec.license = 'MIT'
18
14
 
15
+
16
+ spec.summary = 'Produz valores monetários por extenso\
17
+ em portugês de portugal ou brasil.'
18
+ spec.description = spec.summary + ' Os valores podem ser um numerico, uma\
19
+ string de digitos ou um conjunto destes (array, range, hash). O extenso\
20
+ pode ser produzido na escala longa (utilizada em todos os países\
21
+ lusófonos) ou na escala curta (utilizada no Brasil). Pode ainda escolher\
22
+ a moeda e a fração da moeda.'
23
+
19
24
  spec.metadata['yard.run'] = 'yard' # use "yard" to build full HTML docs.
20
- # spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
21
25
  spec.metadata['homepage_uri'] = spec.homepage
22
- # spec.metadata["source_code_uri"] = "TODO: Put your gem's public repo URL here."
23
- # spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
24
26
 
25
27
  # Specify which files should be added to the gem when it is released.
26
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
28
+ # loads the files in the RubyGem that have been added into git.
27
29
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
28
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
30
+ `git ls-files -z`.split("\x0").reject \
31
+ { |f| f.match(%r{^(test|spec|features)/}) }
29
32
  end
30
33
  spec.bindir = 'exe'
31
34
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
data/lib/extenso_pt.rb CHANGED
@@ -3,195 +3,258 @@
3
3
  require 'extenso_pt/version'
4
4
  require 'bigdecimal/util'
5
5
 
6
- # @author Hernâni Rodrigues Vaz
6
+ LC = %i[pt br].freeze
7
+ A0020 = {
8
+ pt: ['', 'UM', 'DOIS', 'TRÊS', 'QUATRO', 'CINCO', 'SEIS', 'SETE',
9
+ 'OITO', 'NOVE', 'DEZ', 'ONZE', 'DOZE', 'TREZE', 'CATORZE',
10
+ 'QUINZE', 'DEZASSEIS', 'DEZASSETE', 'DEZOITO', 'DEZANOVE'],
11
+ br: ['', 'UM', 'DOIS', 'TRES', 'QUATRO', 'CINCO', 'SEIS', 'SETE',
12
+ 'OITO', 'NOVE', 'DEZ', 'ONZE', 'DOZE', 'TREZE', 'QUATORZE',
13
+ 'QUINZE', 'DEZESSEIS', 'DEZESSETE', 'DEZOITO', 'DEZENOVE']
14
+ }.freeze
15
+ A0100 = {
16
+ pt: ['', '', 'VINTE', 'TRINTA', 'QUARENTA', 'CINQUENTA', 'SESSENTA',
17
+ 'SETENTA', 'OITENTA', 'NOVENTA'],
18
+ br: ['', '', 'VINTE', 'TRINTA', 'QUARENTA', 'CINQUENTA', 'SESSENTA',
19
+ 'SETENTA', 'OITENTA', 'NOVENTA']
20
+ }.freeze
21
+ A1000 = {
22
+ pt: ['', 'CEM', 'CENTO', 'DUZENTOS', 'TREZENTOS', 'QUATROCENTOS',
23
+ 'QUINHENTOS', 'SEISCENTOS', 'SETECENTOS', 'OITOCENTOS', 'NOVECENTOS'],
24
+ br: ['', 'CEM', 'CENTO', 'DUZENTOS', 'TREZENTOS', 'QUATROCENTOS',
25
+ 'QUINHENTOS', 'SEISCENTOS', 'SETECENTOS', 'OITOCENTOS', 'NOVECENTOS']
26
+ }.freeze
27
+ A1E24 = {
28
+ pt: ['', 'MIL', ' MILHÃO', ' MIL MILHÃO', ' BILIÃO', ' MIL BILIÃO',
29
+ ' TRILIÃO', ' MIL TRILIÃO', '', ' MIL', ' MILHÕES', ' MIL MILHÕES',
30
+ ' BILIÕES', ' MIL BILIÕES', ' TRILIÕES', ' MIL TRILIÕES'],
31
+ br: ['', 'MIL', ' MILHÃO', ' BILHÃO', ' TRILHÃO', ' QUADRILHÃO',
32
+ ' QUINTILHÃO', ' SEXTILHÃO', '', ' MIL', ' MILHÕES', ' BILHÕES',
33
+ ' TRILHÕES', ' QUADRILHÕES', ' QUINTILHÕES', ' SEXTILHÕES']
34
+ }.freeze
35
+
36
+ # @author Hernani Rodrigues Vaz
7
37
  module ExtensoPt
8
38
  class Error < StandardError; end
9
39
 
10
- LC = %i[pt br].freeze
11
- A0020 = { pt: ['', 'UM', 'DOIS', 'TRÊS', 'QUATRO', 'CINCO', 'SEIS', 'SETE', 'OITO', 'NOVE', 'DEZ', 'ONZE', 'DOZE', 'TREZE', 'CATORZE', 'QUINZE', 'DEZASSEIS', 'DEZASSETE', 'DEZOITO', 'DEZANOVE'],
12
- br: ['', 'UM', 'DOIS', 'TRES', 'QUATRO', 'CINCO', 'SEIS', 'SETE', 'OITO', 'NOVE', 'DEZ', 'ONZE', 'DOZE', 'TREZE', 'QUATORZE', 'QUINZE', 'DEZESSEIS', 'DEZESSETE', 'DEZOITO', 'DEZENOVE'] }.freeze
13
- A0100 = { pt: ['', '', 'VINTE', 'TRINTA', 'QUARENTA', 'CINQUENTA', 'SESSENTA', 'SETENTA', 'OITENTA', 'NOVENTA'],
14
- br: ['', '', 'VINTE', 'TRINTA', 'QUARENTA', 'CINQUENTA', 'SESSENTA', 'SETENTA', 'OITENTA', 'NOVENTA'] }.freeze
15
- A1000 = { pt: ['', 'CEM', 'CENTO', 'DUZENTOS', 'TREZENTOS', 'QUATROCENTOS', 'QUINHENTOS', 'SEISCENTOS', 'SETECENTOS', 'OITOCENTOS', 'NOVECENTOS'],
16
- br: ['', 'CEM', 'CENTO', 'DUZENTOS', 'TREZENTOS', 'QUATROCENTOS', 'QUINHENTOS', 'SEISCENTOS', 'SETECENTOS', 'OITOCENTOS', 'NOVECENTOS'] }.freeze
17
- 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'],
18
- 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'] }.freeze
19
-
20
- # Produz o extenso das centenas em portugûes de portugal ou brasil.
40
+ # Produz o extenso das centenas em portugues de portugal ou brasil.
21
41
  #
22
42
  # @param [Integer] mil o valor dum grupo 3 digitos a converter
23
43
  # @return [String] o extenso das centenas
24
44
  def self.e900(mil)
25
- A1000[@@lc][(mil > 100 ? 1 : 0) + mil / 100] + (mil > 100 && mil % 100 > 0 ? ' E ' : '')
45
+ A1000[@lc][(mil > 100 ? 1 : 0) + mil / 100] +
46
+ (mil > 100 && (mil % 100).positive? ? ' E ' : '')
26
47
  end
27
48
 
28
- # Produz o extenso das dezenas em portugûes de portugal ou brasil.
49
+ # Produz o extenso das dezenas em portugues de portugal ou brasil.
29
50
  #
30
51
  # @param [Integer] mil o valor dum grupo 3 digitos a converter
31
52
  # @return [String] o extenso das dezenas
32
53
  def self.e90(mil)
33
- A0100[@@lc][mil % 100 / 10] + (mil > 20 && mil % 10 > 0 ? ' E ' : '')
54
+ A0100[@lc][mil % 100 / 10] + (mil > 20 && (mil % 10).positive? ? ' E ' : '')
34
55
  end
35
56
 
36
- # Produz o extenso das unidades em portugûes de portugal ou brasil.
57
+ # Produz o extenso das unidades em portugues de portugal ou brasil.
37
58
  #
38
- # @param [Integer] mil o valor dum grupo 3 digitos a converter
59
+ # @param [Integer] cem o valor dum grupo 3 digitos a converter
39
60
  # @return [String] o extenso das unidades
40
61
  def self.e9(cem)
41
- A0020[@@lc][(cem < 20 ? cem : cem % 10)]
62
+ A0020[@lc][(cem < 20 ? cem : cem % 10)]
42
63
  end
43
64
 
44
- # Produz o qualificador grupo de 3 digitos em portugûes de portugal ou brasil.
65
+ # Produz extenso parte fracionaria em portugues de portugal ou brasil.
45
66
  #
46
- # @param [Integer] pos posição actual nos grupos 3 digitos do valor monetário
47
- # @return [String] o qualificador grupo de 3 digitos
48
- def self.e1e24(pos)
49
- A1e24[@@lc][@@ai[pos] > 0 ? @@ai[pos] > 1 ? 8 + pos : 0 + pos : 0]
50
- end
51
-
52
- # Produz o extenso da parte fracionária dum valor monetário em portugûes de portugal ou brasil.
53
- #
54
- # @return [String] o extenso da parte fracionária dum valor monetário
67
+ # @return [String] o extenso da parte fracionaria dum valor monetario
55
68
  def self.ef99
56
- e90(@@nf) + e9(@@nf) + (@@nf == 1 ? ' ' + @@cs : @@nf > 1 ? ' ' + @@cp : '')
69
+ if @nf.positive?
70
+ e90(@nf) + e9(@nf) + (@nf > 1 ? ' ' + @cp : ' ' + @cs)
71
+ else
72
+ ''
73
+ end
57
74
  end
58
75
 
59
- # Produz final da moeda em portugûes de portugal ou brasil.
76
+ # Produz final da moeda em portugues de portugal ou brasil.
60
77
  #
61
78
  # @return [String] o final da moeda
62
79
  def self.efim
63
- # soma todos os grupos do valor monetário
64
- sto = @@s6 + @@m6
65
-
66
- (@@s6 == 0 && @@m6 > 0 ? ' DE' : '') + # proposição DE se zero nos primeiros 6 digitos e maiores que 1e6
67
- (sto == 1 ? ' ' + @@ms : sto > 1 ? ' ' + @@mp : '') + # singular/plural da moeda
68
- (sto > 0 && @@nf > 0 ? ' E ' : '') + # proposição E entre parte inteira e parte fracionária
69
- ef99 # extenso da parte fracionária dum valor monetário
80
+ # proposicao DE entre parte inteira e moeda
81
+ emo = @de ? ' DE' : ''
82
+ # moeda singular/plural
83
+ emo += @tt > 1 ? ' ' + @mp : ' ' + @ms if @tt.positive?
84
+ # proposicao E entre moeda e parte fracionaria
85
+ # extenso da parte fracionaria
86
+ emo + (@tt.positive? && @nf.positive? ? ' E ' : '') + ef99
70
87
  end
71
88
 
72
- # Produz o extenso grupo 3 digitos em portugûes de portugal ou brasil.
89
+ # Produz separador entre grupos 3 digitos
73
90
  #
74
- # @param [Integer] pos posição actual nos grupos 3 digitos do valor monetário
75
- # @return [String] o extenso grupo 3 digitos
76
- def self.edg3(pos)
77
- # extenso do grupo actual 3 digitos
78
- pos == 1 && @@ai[pos] == 1 ? e1e24(pos) : e900(@@ai[pos]) + e90(@@ai[pos]) + e9(@@ai[pos] % 100) + e1e24(pos)
79
- end
80
-
81
- # Produz separação entre grupos 3 digitos
82
- #
83
- # @param [Integer] pos posição actual nos grupos 3 digitos do valor monetário
84
- # @return [String] separação entre grupos 3 digitos
91
+ # @param [Integer] pos posicao actual nos grupos 3 digitos do valor monetario
92
+ # @return [String] separador entre grupos 3 digitos
85
93
  def self.esep(pos)
86
- pos > 0 ? @@ai[pos - 1] > 100 ? ' ' : @@ai[pos - 1] > 0 ? ' E ' : '' : ''
87
- end
88
-
89
- # Parametrizar grupos 3 digitos para controle de singular/plural
90
- #
91
- def self.pdg3
92
- @@s6 = @@ai[0].to_i + @@ai[1].to_i * 2 # soma grupos 1,2 (primeiros 6 digitos)
93
- @@m6 = @@ai[2..-1].to_a.inject(:+).to_i * 2 # soma grupos 3.. (digitos acima de 6)
94
+ if pos.positive? && @ai[pos - 1].positive?
95
+ @ai[pos - 1] > 100 ? ' ' : ' E '
96
+ else
97
+ ''
98
+ end
94
99
  end
95
100
 
96
- # Parametrizar parte inteira/fracionária do valor monetário
101
+ # Produz qualificador grupo de 3 digitos em portugues de portugal ou brasil.
97
102
  #
98
- # @param [String] dig string de digitos do valor monetário
99
- def self.pintfra(dig)
100
- # parte inteira do valor monetário => array grupos 3 digitos ex: 123022.12 => [22, 123]
101
- @@ai = dig[/^\d+/].to_s.reverse.scan(/\d{1,3}/).map { |i| i.reverse.to_i }
102
-
103
- # parte fracionária do valor monetário ex: 123022.12 => 12
104
- # arredondada a 2 casas decimais (cêntimos/centavos)
105
- @@nf = (dig[/\.\d*/].to_f * 100).round
103
+ # @param [Integer] pos posicao actual nos grupos 3 digitos do valor monetario
104
+ # @return [String] qualificador grupo de 3 digitos
105
+ def self.e1e24(pos)
106
+ if @ai[pos].positive?
107
+ A1E24[@lc][@ai[pos] > 1 ? 8 + pos : pos]
108
+ else
109
+ ''
110
+ end
106
111
  end
107
112
 
108
- private_class_method :pintfra, :pdg3, :esep, :edg3, :e1e24, :e900, :e90, :e9, :ef99, :efim
109
-
110
- # Parametrizar moeda inferindo singular a partir do plural
113
+ # Produz extenso grupo 3 digitos em portugues de portugal ou brasil.
111
114
  #
112
- # @param [Hash] moeda as opcoes para parametrizar a moeda/fração
113
- # @option moeda [Symbol] :lc locale do extenso - portugûes de portugal (:pt) ou brasil (:br)
114
- # @option moeda [String] :msingular moeda no singular - pode ser inferido do plural menos "S"
115
- # @option moeda [String] :fsingular fração no singular - pode ser inferido do plural menos "S"
116
- # @option moeda [String] :mplural moeda no plural
117
- # @option moeda [String] :fplural fração no plural
118
- def self.isingular(moeda)
119
- @@ms = moeda[:msingular] || (moeda[:mplural].to_s[-1] == 'S' ? moeda[:mplural][0..-2] : 'EURO')
120
- @@cs = moeda[:fsingular] || (moeda[:fplural].to_s[-1] == 'S' ? moeda[:fplural][0..-2] : 'CÊNTIMO')
115
+ # @param [Integer] pos posicao actual nos grupos 3 digitos do valor monetario
116
+ # @return [String] extenso grupo 3 digitos
117
+ def self.edg3(pos)
118
+ dg3 = if pos == 1 && @ai[pos] == 1
119
+ # caso especial MIL EUROS
120
+ ''
121
+ else
122
+ e900(@ai[pos]) + e90(@ai[pos]) + e9(@ai[pos] % 100)
123
+ end
124
+ # qualificador grupo de 3 digitos
125
+ dg3 + e1e24(pos)
121
126
  end
122
127
 
123
- # Parametrizar moeda inferindo plural a partir do singular
128
+ # Parametrizar controle singular/plural & proposicoes
124
129
  #
125
- # @param [Hash] moeda as opcoes para parametrizar a moeda/fração
126
- # @option moeda [Symbol] :lc locale do extenso - portugûes de portugal (:pt) ou brasil (:br)
127
- # @option moeda [String] :msingular moeda no singular
128
- # @option moeda [String] :fsingular fração no singular
129
- # @option moeda [String] :mplural moeda no plural - pode ser inferido do singular mais "S"
130
- # @option moeda [String] :fplural fração no plural - pode ser inferido do singular mais "S"
131
- def self.iplural(moeda)
132
- @@mp = moeda[:mplural] || @@ms + 'S'
133
- @@cp = moeda[:fplural] || @@cs + 'S'
130
+ def self.pcontrolo
131
+ # soma grupos 1,2 (primeiros 6 digitos)
132
+ @s6 = @ai[0].to_i + @ai[1].to_i * 2
133
+ # soma grupos 3.. (digitos acima de 6)
134
+ @m6 = @ai[2..-1].to_a.inject(:+).to_i * 2
135
+ @tt = @s6 + @m6 # proposicao E & singular/plural
136
+ @de = @s6.zero? && @m6.positive? # proposicao DE
134
137
  end
135
138
 
136
- # Produz o extenso dum valor monetário em portugûes de portugal ou brasil.
139
+ # Produz o extenso dum valor monetario em portugues de portugal ou brasil.
137
140
  #
138
- # @param [Integer] pos posição actual nos grupos 3 digitos do valor monetário
139
- # @param [String] ext extenso actual em construção
140
- # @return [String] o extenso dum valor monetário
141
+ # @param [Integer] pos posicao actual nos grupos 3 digitos do valor monetario
142
+ # @param [String] ext extenso em construcao
143
+ # @return [String] o extenso dum valor monetario
141
144
  def self.enumerico(pos = 0, ext = '')
142
- # testa fim do valor monetário
143
- if pos >= @@ai.count
144
- # parametrizar grupos 3 digitos (@@s6, @@m6) para controle de singular/plural
145
- pdg3
145
+ # testa fim do valor monetario
146
+ if pos >= @ai.count
147
+ # parametrizar controle singular/plural & proposicoes
148
+ pcontrolo
146
149
 
147
150
  # caso especial zero
148
- @@s6 == 0 && @@m6 == 0 && @@nf == 0 ? 'ZERO ' + @@mp : ext + efim
151
+ (@tt + @nf).zero? ? 'ZERO ' + @mp : ext + efim
149
152
  else
150
153
  # tratamento do proximo grupo 3 digitos
151
154
  enumerico(pos + 1, edg3(pos) + esep(pos) + ext)
152
155
  end
153
156
  end
154
157
 
155
- # Converte um objeto criando extenso(s) em portugûes de portugal ou brasil.
158
+ # Parametrizar parte inteira/fracionaria do valor monetario
159
+ #
160
+ # @param [String] dig string de digitos rdo valor monetario
161
+ def self.pintfra(dig)
162
+ # parte inteira do valor monetario => array grupos 3 digitos
163
+ # ex: 123022.12 => [22, 123]
164
+ @ai = dig[/^\d+/].to_s.reverse.scan(/\d{1,3}/).map { |i| i.reverse.to_i }
165
+
166
+ # parte fracionaria do valor monetario
167
+ # ex: 123022.12 => 12
168
+ # arredondada a 2 casas decimais (centimos/centavos)
169
+ @nf = (dig[/\.\d*/].to_f * 100).round
170
+ end
171
+
172
+ private_class_method :pintfra, :pcontrolo, :esep, :edg3, :e1e24,
173
+ :e900, :e90, :e9, :ef99, :efim
174
+
175
+ # Converte um objeto criando extenso(s) em portugues de portugal ou brasil.
156
176
  #
157
- # @param [Object] objeto o objeto a converter pode ser (String, Float, Integer, Array, Range, Hash) ou uma mistura
158
- # @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)
177
+ # @param [Object] objeto objeto a converter
178
+ # (String, Float, Integer, Array, Range, Hash)
179
+ # @return [String] extenso se objecto for (String, Float, Integer),
180
+ # Array<extensos> se objecto for (Array, Range),
181
+ # Hash<extensos> se objecto for (Hash)
159
182
  def self.pobjeto(obj)
160
183
  if obj.is_a?(Hash)
161
- # converte os valores do Hash nos seus extensos mantendo as chaves - devolve um Hash
184
+ # converte os valores do Hash nos seus extensos - devolve um Hash
162
185
  obj.map { |k, v| [k, pobjeto(v)] }.to_h
163
- elsif obj.respond_to? :to_a
164
- # converte o objecto num Array e converte os valores do Array nos seus extensos - devolve um Array
186
+ elsif obj.respond_to?(:to_a)
187
+ # converte o objecto num Array com os extensos dos valores
165
188
  obj.to_a.map { |v| pobjeto(v) }
166
189
  else
167
190
  # converte objeto numa string de digitos
168
- # usa bigdecimal/util para evitar aritmética binária (tem problemas com valores >1e12)
169
- # qualquer valor não convertivel (ex: texto) resulta em "0.0"
191
+ # usa bigdecimal/util para evitar aritmetica binaria
192
+ # (tem problemas com valores >1e12)
193
+ # qualquer valor nao convertivel (ex: texto) resulta em "0.0"
170
194
  sdigitos = obj.to_d.to_s('F')
171
195
 
172
- # parametrizar parte inteira/fracionária (@@ai, @@nf) do valor monetário
196
+ # parametrizar parte inteira/fracionaria (@ai, @nf) do valor monetario
173
197
  pintfra(sdigitos)
174
198
 
175
- # processar extenso - valores superiores a 1e24 não são tratados
199
+ # processar extenso - valores superiores a 1e24 nao sao tratados
176
200
  sdigitos[/^\d+/].length <= 24 ? enumerico : ''
177
201
  end
178
202
  end
179
203
 
180
- # Produz extenso(s) de objeto(s) em portugûes de portugal ou brasil.
204
+ # Parametrizar moeda inferindo singular a partir do plural
181
205
  #
182
- # @param [Hash] moeda as opcoes para parametrizar a moeda/fração
183
- # @option moeda [Symbol] :lc locale do extenso - portugûes de portugal (:pt) ou brasil (:br)
184
- # @option moeda [String] :msingular moeda no singular
185
- # @option moeda [String] :fsingular fração no singular
206
+ # @param [Hash] moeda as opcoes para parametrizar a moeda/fracao
207
+ # @option moeda [Symbol] :lc locale do extenso -
208
+ # portugues de portugal (:pt) ou brasil (:br)
209
+ # @option moeda [String] :msingular moeda no singular -
210
+ # inferido do plural menos "S"
211
+ # @option moeda [String] :fsingular fracao no singular -
212
+ # inferido do plural menos "S"
186
213
  # @option moeda [String] :mplural moeda no plural
187
- # @option moeda [String] :fplural fração no plural
188
- # @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)
189
- def extenso(moeda = { lc: :pt, msingular: 'EURO', fsingular: 'CÊNTIMO' })
190
- # parametrização por defeito para :br
191
- moeda = { lc: :br, msingular: 'REAL', mplural: 'REAIS', fsingular: 'CENTAVO' } if moeda[:lc] == :br && !moeda[:msingular] && !moeda[:mplural]
214
+ # @option moeda [String] :fplural fracao no plural
215
+ def self.isingular(moeda)
216
+ @ms = moeda[:msingular] ||
217
+ (moeda[:mplural].to_s[-1] == 'S' ? moeda[:mplural][0..-2] : 'EURO')
218
+ @cs = moeda[:fsingular] ||
219
+ (moeda[:fplural].to_s[-1] == 'S' ? moeda[:fplural][0..-2] : 'CÊNTIMO')
220
+ end
192
221
 
222
+ # Parametrizar moeda inferindo plural a partir do singular
223
+ #
224
+ # @param [Hash] moeda as opcoes para parametrizar a moeda/fracao
225
+ # @option moeda [Symbol] :lc locale do extenso -
226
+ # portugues de portugal (:pt) ou brasil (:br)
227
+ # @option moeda [String] :msingular moeda no singular
228
+ # @option moeda [String] :fsingular fracao no singular
229
+ # @option moeda [String] :mplural moeda no plural -
230
+ # inferido do singular mais "S"
231
+ # @option moeda [String] :fplural fracao no plural -
232
+ # inferido do singular mais "S"
233
+ def self.iplural(moeda)
193
234
  # somente [:pt, :br]
194
- @@lc = LC.include?(moeda[:lc]) ? moeda[:lc] : :pt
235
+ @lc = LC.include?(moeda[:lc]) ? moeda[:lc] : :pt
236
+
237
+ @mp = moeda[:mplural] || @ms + 'S'
238
+ @cp = moeda[:fplural] || @cs + 'S'
239
+ end
240
+
241
+ # Produz extenso(s) de objeto(s) em portugues de portugal ou brasil.
242
+ #
243
+ # @param [Hash] moeda as opcoes para parametrizar a moeda/fracao
244
+ # @option moeda [Symbol] :lc locale do extenso -
245
+ # portugues de portugal (:pt) ou brasil (:br)
246
+ # @option moeda [String] :msingular moeda no singular
247
+ # @option moeda [String] :fsingular fracao no singular
248
+ # @option moeda [String] :mplural moeda no plural
249
+ # @option moeda [String] :fplural fracao no plural
250
+ # @return [String] extenso se objecto for (String, Float, Integer),
251
+ # Array<extensos> se objecto for (Array, Range),
252
+ # Hash<extensos> se objecto for (Hash)
253
+ def extenso(moeda = { lc: :pt, msingular: 'EURO', fsingular: 'CÊNTIMO' })
254
+ # parametrizacao por defeito para :br
255
+ if moeda[:lc] == :br && !moeda[:msingular] && !moeda[:mplural]
256
+ moeda.merge!(msingular: 'REAL', mplural: 'REAIS', fsingular: 'CENTAVO')
257
+ end
195
258
 
196
259
  # parametrizar moeda
197
260
  ExtensoPt.isingular(moeda)
@@ -201,9 +264,33 @@ module ExtensoPt
201
264
  ExtensoPt.pobjeto(self)
202
265
  end
203
266
  end
204
- class Hash; include ExtensoPt; end
205
- class Array; include ExtensoPt; end
206
- class Range; include ExtensoPt; end
207
- class Float; include ExtensoPt; end
208
- class Integer; include ExtensoPt; end
209
- class String; include ExtensoPt; end
267
+
268
+ # permite obter um Hash com valores numericos convertidos nos seus extensos
269
+ class Hash
270
+ include ExtensoPt
271
+ end
272
+
273
+ # permite obter um Array com valores numericos convertidos nos seus extensos
274
+ class Array
275
+ include ExtensoPt
276
+ end
277
+
278
+ # permite obter um Array com valores numericos convertidos nos seus extensos
279
+ class Range
280
+ include ExtensoPt
281
+ end
282
+
283
+ # permite obter o extenso dum Float
284
+ class Float
285
+ include ExtensoPt
286
+ end
287
+
288
+ # permite obter o extenso dum Integer
289
+ class Integer
290
+ include ExtensoPt
291
+ end
292
+
293
+ # permite obter o extenso duma String de digitos
294
+ class String
295
+ include ExtensoPt
296
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ExtensoPt
4
- VERSION = '0.5.3'
4
+ VERSION = '0.5.4'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: extenso_pt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.3
4
+ version: 0.5.4
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: 2019-09-27 00:00:00.000000000 Z
11
+ date: 2019-09-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bigdecimal
@@ -66,11 +66,12 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '10.0'
69
- description: Produz valores monetários por extenso em portugês de portugal ou brasil.
70
- Os valores podem ser um numerico, uma string de digitos ou um conjunto destes (array,
71
- range, hash). O extenso pode ser produzido na escala longa (utilizada em todos os
72
- países lusófonos) ou na escala curta (utilizada no Brasil). Pode ainda escolher
73
- a moeda e a fração da moeda.
69
+ description: |-
70
+ Produz valores monetários por extenso\ em portugês de portugal ou brasil. Os valores podem ser um numerico, uma\
71
+ string de digitos ou um conjunto destes (array, range, hash). O extenso\
72
+ pode ser produzido na escala longa (utilizada em todos os países\
73
+ lusófonos) ou na escala curta (utilizada no Brasil). Pode ainda escolher\
74
+ a moeda e a fração da moeda.
74
75
  email:
75
76
  - hernanirvaz@gmail.com
76
77
  executables: []
@@ -79,8 +80,6 @@ extra_rdoc_files: []
79
80
  files:
80
81
  - ".gitignore"
81
82
  - ".project_alt.json"
82
- - ".rubocop.yml"
83
- - ".rubocop_todo.yml"
84
83
  - ".travis.yml"
85
84
  - Gemfile
86
85
  - Gemfile.lock
@@ -116,5 +115,5 @@ requirements: []
116
115
  rubygems_version: 3.0.3
117
116
  signing_key:
118
117
  specification_version: 4
119
- summary: Produz valores monetários por extenso em portugês de portugal ou brasil.
118
+ summary: Produz valores monetários por extenso\ em portugês de portugal ou brasil.
120
119
  test_files: []
data/.rubocop.yml DELETED
@@ -1 +0,0 @@
1
- inherit_from: .rubocop_todo.yml
data/.rubocop_todo.yml DELETED
@@ -1,74 +0,0 @@
1
- # This configuration was generated by
2
- # `rubocop --auto-gen-config`
3
- # on 2019-09-25 11:13:11 +0100 using RuboCop version 0.74.0.
4
- # The point is for the user to remove these configuration records
5
- # one by one as the offenses are removed from the code base.
6
- # Note that changes in the inspected code, or installation of new
7
- # versions of RuboCop, may require this file to be generated again.
8
-
9
- # Offense count: 1
10
- #Lint/RequireParentheses:
11
- # Exclude:
12
- # - 'lib/extenso_pt.rb'
13
-
14
- # Offense count: 4
15
- #Metrics/AbcSize:
16
- # Max: 58
17
-
18
- # Offense count: 3
19
- Metrics/CyclomaticComplexity:
20
- Max: 17
21
-
22
- # Offense count: 3
23
- # Configuration parameters: CountComments, ExcludedMethods.
24
- Metrics/MethodLength:
25
- Max: 24
26
-
27
- # Offense count: 3
28
- Metrics/PerceivedComplexity:
29
- Max: 19
30
-
31
- # Offense count: 1
32
- Naming/ConstantName:
33
- Exclude:
34
- - 'lib/extenso_pt.rb'
35
-
36
- # Offense count: 39
37
- # Configuration parameters: AllowedChars.
38
- Style/AsciiComments:
39
- Exclude:
40
- - 'lib/extenso_pt.rb'
41
- - 'test/extenso_pt_test.rb'
42
-
43
- # Offense count: 7
44
- Style/ClassVars:
45
- Exclude:
46
- - 'lib/extenso_pt.rb'
47
-
48
- # Offense count: 6
49
- Style/Documentation:
50
- Exclude:
51
- - 'spec/**/*'
52
- - 'test/**/*'
53
- - 'lib/extenso_pt.rb'
54
-
55
- # Offense count: 2
56
- Style/NestedTernaryOperator:
57
- Exclude:
58
- - 'lib/extenso_pt.rb'
59
-
60
- # Offense count: 10
61
- # Cop supports --auto-correct.
62
- # Configuration parameters: AutoCorrect, EnforcedStyle, IgnoredMethods.
63
- # SupportedStyles: predicate, comparison
64
- Style/NumericPredicate:
65
- Exclude:
66
- - 'spec/**/*'
67
- - 'lib/extenso_pt.rb'
68
-
69
- # Offense count: 53
70
- # Cop supports --auto-correct.
71
- # Configuration parameters: AutoCorrect, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
72
- # URISchemes: http, https
73
- Metrics/LineLength:
74
- Max: 317