extenso_pt 0.5.8 → 0.6.0
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 +4 -4
- data/Gemfile.lock +1 -1
- data/lib/extenso_pt/{module.rb → extenso.rb} +22 -26
- data/lib/extenso_pt/romana.rb +26 -0
- data/lib/extenso_pt/version.rb +1 -1
- data/lib/extenso_pt.rb +36 -66
- metadata +4 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d1bdf0ca3275038eec98c0152caab67df72476569e5fcf1da8eef189d5fa1d0b
|
|
4
|
+
data.tar.gz: a7c217ea1f7f3bf22803c4b7934b932bc345b82a1659498badd727d7899c7954
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: af9fddecbf22b45279b0c47aa89ee161dcd9cbd3ac0a0d23ca199e9ca000dc6c1c86c37ffd69d01763d7b86d2a230e3f1e8a529b3135076458fcd9e358c99465
|
|
7
|
+
data.tar.gz: b398d10b05e86044c0cc5a8ed2df5b72d77fe7ec2a10d3795c1e28624d133654a602d533caf10c183adba31849c17921d20a57578079dda6685aa0a9b43f0d03
|
data/Gemfile.lock
CHANGED
|
@@ -15,7 +15,7 @@ module ExtensoPt
|
|
|
15
15
|
#
|
|
16
16
|
# @param [Integer] cem o valor dum grupo 3 digitos a converter
|
|
17
17
|
# @return [String] o extenso das dezenas
|
|
18
|
-
def self.
|
|
18
|
+
def self.e090(cem)
|
|
19
19
|
A0100[@lc][cem / 10] +
|
|
20
20
|
(cem > 20 && (cem % 10).positive? ? ' E ' : '') # proposicao
|
|
21
21
|
end
|
|
@@ -24,7 +24,7 @@ module ExtensoPt
|
|
|
24
24
|
#
|
|
25
25
|
# @param [Integer] cem o valor dum grupo 3 digitos a converter
|
|
26
26
|
# @return [String] o extenso das unidades
|
|
27
|
-
def self.
|
|
27
|
+
def self.e009(cem)
|
|
28
28
|
A0020[@lc][cem < 20 ? cem : cem % 10]
|
|
29
29
|
end
|
|
30
30
|
|
|
@@ -37,7 +37,7 @@ module ExtensoPt
|
|
|
37
37
|
@cp ||= @ms + 'S'
|
|
38
38
|
|
|
39
39
|
if @nf.positive?
|
|
40
|
-
|
|
40
|
+
e090(@nf) + e009(@nf) + (@nf > 1 ? ' ' + @cp : ' ' + @cs)
|
|
41
41
|
else
|
|
42
42
|
''
|
|
43
43
|
end
|
|
@@ -64,7 +64,7 @@ module ExtensoPt
|
|
|
64
64
|
#
|
|
65
65
|
# @param [Integer] pos posicao actual nos grupos 3 digitos do valor monetario
|
|
66
66
|
# @return [String] separador entre grupos 3 digitos
|
|
67
|
-
def self.
|
|
67
|
+
def self.edgs(pos)
|
|
68
68
|
if pos.positive? && @ai[pos - 1].positive?
|
|
69
69
|
@ai[pos - 1] > 100 ? ' ' : ' E '
|
|
70
70
|
else
|
|
@@ -76,7 +76,7 @@ module ExtensoPt
|
|
|
76
76
|
#
|
|
77
77
|
# @param [Integer] pos posicao actual nos grupos 3 digitos do valor monetario
|
|
78
78
|
# @return [String] qualificador grupo de 3 digitos
|
|
79
|
-
def self.
|
|
79
|
+
def self.e124(pos)
|
|
80
80
|
if @ai[pos].positive?
|
|
81
81
|
@ai[pos] > 1 ? P1E24[@lc][pos] : S1E24[@lc][pos]
|
|
82
82
|
else
|
|
@@ -98,16 +98,16 @@ module ExtensoPt
|
|
|
98
98
|
# caso especial MIL EUROS
|
|
99
99
|
''
|
|
100
100
|
else
|
|
101
|
-
e900(@ai[pos]) +
|
|
101
|
+
e900(@ai[pos]) + e090(@ai[pos] % 100) + e009(@ai[pos] % 100)
|
|
102
102
|
end
|
|
103
103
|
# qualificador grupo de 3 digitos
|
|
104
|
-
dg3 +
|
|
104
|
+
dg3 + e124(pos)
|
|
105
105
|
end
|
|
106
106
|
|
|
107
107
|
# Parametrizar controle singular/plural & proposicoes
|
|
108
108
|
#
|
|
109
109
|
# @return [void]
|
|
110
|
-
def self.
|
|
110
|
+
def self.epsp
|
|
111
111
|
# soma grupos 1,2 (primeiros 6 digitos)
|
|
112
112
|
@s6 = @ai[0].to_i + @ai[1].to_i * 2
|
|
113
113
|
# soma grupos 3.. (digitos acima de 6)
|
|
@@ -121,17 +121,17 @@ module ExtensoPt
|
|
|
121
121
|
# @param [Integer] pos posicao actual nos grupos 3 digitos do valor monetario
|
|
122
122
|
# @param [String] ext extenso em construcao
|
|
123
123
|
# @return [String] o extenso dum valor monetario
|
|
124
|
-
def self.
|
|
124
|
+
def self.etot(pos, ext)
|
|
125
125
|
# testa fim do valor monetario
|
|
126
126
|
if pos >= @ai.count
|
|
127
127
|
# parametrizar controle singular/plural & proposicoes
|
|
128
|
-
|
|
128
|
+
epsp
|
|
129
129
|
|
|
130
130
|
# caso especial zero
|
|
131
131
|
(@tt + @nf).zero? ? 'ZERO ' + @mp : ext + efim
|
|
132
132
|
else
|
|
133
133
|
# tratamento do proximo grupo 3 digitos
|
|
134
|
-
|
|
134
|
+
etot(pos + 1, edg3(pos) + edgs(pos) + ext)
|
|
135
135
|
end
|
|
136
136
|
end
|
|
137
137
|
|
|
@@ -139,7 +139,7 @@ module ExtensoPt
|
|
|
139
139
|
#
|
|
140
140
|
# @param [String] digitos do valor monetario
|
|
141
141
|
# @return [void]
|
|
142
|
-
def self.
|
|
142
|
+
def self.epif(dig)
|
|
143
143
|
# parte inteira do valor monetario => array grupos 3 digitos
|
|
144
144
|
# ex: 123022.12 => [22, 123]
|
|
145
145
|
@ai = dig[/^\d+/].to_s.reverse.scan(/\d{1,3}/).map { |i| i.reverse.to_i }
|
|
@@ -158,23 +158,19 @@ module ExtensoPt
|
|
|
158
158
|
# se objecto for (String, Float, Integer),
|
|
159
159
|
# array<extensos> se objecto for (Array, Range),
|
|
160
160
|
# hash<extensos> se objecto for (Hash)
|
|
161
|
-
def self.
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
elsif obj.respond_to?(:to_a)
|
|
166
|
-
# converte o objecto num Array com os extensos dos valores
|
|
167
|
-
obj.to_a.map { |a| o2e(a) }
|
|
161
|
+
def self.eo2e(obj)
|
|
162
|
+
# converte os valores do Hash nos seus extensos - devolve um Hash
|
|
163
|
+
if obj.is_a?(Hash) then obj.map { |k, v| [k, eo2e(v)] }.to_h
|
|
164
|
+
# converte o objecto num Array com os extensos dos valores
|
|
165
|
+
elsif obj.respond_to?(:to_a) then obj.to_a.map { |a| eo2e(a) }
|
|
168
166
|
else
|
|
169
167
|
# converte objeto em string digitos utilizando bigdecimal para
|
|
170
168
|
# evitar problemas com aritmetica virgula flutuante em valores >1e12
|
|
171
|
-
digitos = obj.to_d.to_s('F')
|
|
172
|
-
|
|
173
169
|
# parametrizar parte inteira/fracionaria (@ai, @nf) do valor monetario
|
|
174
|
-
|
|
170
|
+
epif(obj.to_d.to_s('F'))
|
|
175
171
|
|
|
176
|
-
# processar extenso - valores
|
|
177
|
-
|
|
172
|
+
# processar extenso - valores >1e24 nao sao tratados
|
|
173
|
+
@ai.count > 8 ? '' : etot(0, '')
|
|
178
174
|
end
|
|
179
175
|
end
|
|
180
176
|
|
|
@@ -190,7 +186,7 @@ module ExtensoPt
|
|
|
190
186
|
# @option moeda [String] :mplural moeda no plural
|
|
191
187
|
# @option moeda [String] :fplural fracao no plural
|
|
192
188
|
# @return [void]
|
|
193
|
-
def self.
|
|
189
|
+
def self.epsi(moeda)
|
|
194
190
|
@ms = moeda[:msingular] ||
|
|
195
191
|
(moeda[:mplural].to_s[-1] == 'S' ? moeda[:mplural][0..-2] : 'EURO')
|
|
196
192
|
@cs = moeda[:fsingular] ||
|
|
@@ -209,7 +205,7 @@ module ExtensoPt
|
|
|
209
205
|
# @option moeda [String] :fplural fracao no plural -
|
|
210
206
|
# inferido do singular mais "S"
|
|
211
207
|
# @return [void]
|
|
212
|
-
def self.
|
|
208
|
+
def self.eppl(moeda)
|
|
213
209
|
# somente [:pt, :br]
|
|
214
210
|
@lc = EXTLC.include?(moeda[:lc]) ? moeda[:lc] : :pt
|
|
215
211
|
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# @author Hernani Rodrigues Vaz
|
|
4
|
+
module ExtensoPt
|
|
5
|
+
# Recursivamente produz numeral romano
|
|
6
|
+
#
|
|
7
|
+
# @param [Integer] numero a converter em numeral romano
|
|
8
|
+
# @return [String] numeral romano
|
|
9
|
+
def self.ri2r(numero)
|
|
10
|
+
return '' if numero <= 0
|
|
11
|
+
|
|
12
|
+
ROMAN.each { |r, v| return r.to_s + ri2r(numero - v) if v <= numero }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Recursivamente produz inteiro
|
|
16
|
+
#
|
|
17
|
+
# @param [String] numeral romano em convercao
|
|
18
|
+
# @param [Integer] ultimo numeral convertido
|
|
19
|
+
# @return [Integer] inteiro do numeral romano
|
|
20
|
+
def self.rr2i(numeral, ultimo)
|
|
21
|
+
return 0 if numeral.empty?
|
|
22
|
+
|
|
23
|
+
v = ROMAN[numeral[-1].to_sym]
|
|
24
|
+
v < ultimo ? (rr2i(numeral.chop, v) - v) : (rr2i(numeral.chop, v) + v)
|
|
25
|
+
end
|
|
26
|
+
end
|
data/lib/extenso_pt/version.rb
CHANGED
data/lib/extenso_pt.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
require 'bigdecimal/util'
|
|
4
4
|
require 'extenso_pt/version'
|
|
5
5
|
require 'extenso_pt/constantes'
|
|
6
|
-
require 'extenso_pt/
|
|
6
|
+
require 'extenso_pt/extenso'
|
|
7
|
+
require 'extenso_pt/romana'
|
|
7
8
|
|
|
8
9
|
# @author Hernani Rodrigues Vaz
|
|
9
10
|
module ExtensoPt
|
|
@@ -29,91 +30,60 @@ module ExtensoPt
|
|
|
29
30
|
end
|
|
30
31
|
|
|
31
32
|
# parametrizar moeda
|
|
32
|
-
ExtensoPt.
|
|
33
|
-
ExtensoPt.
|
|
33
|
+
ExtensoPt.epsi(moeda)
|
|
34
|
+
ExtensoPt.eppl(moeda)
|
|
34
35
|
|
|
35
36
|
# cria extenso(s) em portugues de portugal ou brasil
|
|
36
|
-
ExtensoPt.
|
|
37
|
+
ExtensoPt.eo2e(self)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Testa se string contem numeracao romana
|
|
41
|
+
#
|
|
42
|
+
# @return [true, false] sim ou nao numeracao romana
|
|
43
|
+
def romana?
|
|
44
|
+
is_a?(String) ? RO_RE.match?(upcase) : false
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Produz numeracao romana a partir de numerico
|
|
48
|
+
# ou numerico a partir da numeracao romana
|
|
49
|
+
# (numerico pode ser uma string digitos)
|
|
50
|
+
#
|
|
51
|
+
# @return [String, Integer] numeracao romana ou inteiro
|
|
52
|
+
def romana
|
|
53
|
+
# converte os valores do Hash
|
|
54
|
+
if is_a?(Hash) then map { |k, v| [k, v.romana] }.to_h
|
|
55
|
+
# converte objecto num Array com os valores convertidos
|
|
56
|
+
elsif respond_to?(:to_a) then to_a.map(&:romana)
|
|
57
|
+
# numeracao romana a partir de inteiro ou string digitos
|
|
58
|
+
elsif (inteiro = to_i).positive? then ExtensoPt.ri2r(inteiro)
|
|
59
|
+
else
|
|
60
|
+
# inteiro a partir da numeracao romana
|
|
61
|
+
RO_RE.match?(to_s) ? ExtensoPt.rr2i(upcase, 0) : ''
|
|
62
|
+
end
|
|
37
63
|
end
|
|
38
64
|
end
|
|
39
65
|
|
|
40
|
-
# permite obter um Hash com valores
|
|
66
|
+
# permite obter um Hash com valores convertidos
|
|
41
67
|
class Hash
|
|
42
68
|
include ExtensoPt
|
|
43
69
|
end
|
|
44
70
|
|
|
45
|
-
# permite obter um Array com valores
|
|
71
|
+
# permite obter um Array com valores convertidos
|
|
46
72
|
class Array
|
|
47
73
|
include ExtensoPt
|
|
48
74
|
end
|
|
49
75
|
|
|
50
|
-
# permite obter um Array com valores
|
|
76
|
+
# permite obter um Array com valores do Range convertidos
|
|
51
77
|
class Range
|
|
52
78
|
include ExtensoPt
|
|
53
79
|
end
|
|
54
80
|
|
|
55
|
-
# permite obter
|
|
56
|
-
class
|
|
81
|
+
# permite obter Float ou Integer convertidos
|
|
82
|
+
class Numeric
|
|
57
83
|
include ExtensoPt
|
|
58
84
|
end
|
|
59
85
|
|
|
60
|
-
# permite obter
|
|
61
|
-
class Integer
|
|
62
|
-
include ExtensoPt
|
|
63
|
-
|
|
64
|
-
# Produz numeracao romana a partir do inteiro
|
|
65
|
-
#
|
|
66
|
-
# @return [String] numeracao romana
|
|
67
|
-
def romana
|
|
68
|
-
return "-#{i2r(-self)}" if negative?
|
|
69
|
-
|
|
70
|
-
i2r(self)
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
# Recursivamente produz numeral romano
|
|
74
|
-
#
|
|
75
|
-
# @param [Integer] numero a converter em numeral romano
|
|
76
|
-
# @return [String] numeral romano
|
|
77
|
-
def i2r(numero)
|
|
78
|
-
return '' if numero.zero?
|
|
79
|
-
|
|
80
|
-
ROMAN.each { |r, v| return r.to_s + i2r(numero - v) if v <= numero }
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
# permite obter o extenso duma string de digitos ou
|
|
85
|
-
# inteiro duma string numeral romano
|
|
86
|
+
# permite obter strings convertidas
|
|
86
87
|
class String
|
|
87
88
|
include ExtensoPt
|
|
88
|
-
|
|
89
|
-
# Testa se string contem numeracao romana
|
|
90
|
-
#
|
|
91
|
-
# @return [true, false] sim ou nao numeracao romana
|
|
92
|
-
def romana?
|
|
93
|
-
RO_RE.match?(upcase)
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
# Produz inteiro a partir da numeracao romana
|
|
97
|
-
# ou numeracao romana a partir de string digitos
|
|
98
|
-
#
|
|
99
|
-
# @return [Integer, String] inteiro ou numeracao romana
|
|
100
|
-
def romana
|
|
101
|
-
return -self[/[^-]+/].romana if /-+/.match?(self)
|
|
102
|
-
return self[/^\d+/].to_i.romana if /^\d+/.match?(self)
|
|
103
|
-
return 0 unless romana?
|
|
104
|
-
|
|
105
|
-
r2i(upcase, 0)
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
# Recursivamente produz inteiro
|
|
109
|
-
#
|
|
110
|
-
# @param [String] numeral romano em convercao
|
|
111
|
-
# @param [Integer] ultimo numeral convertido
|
|
112
|
-
# @return [Integer] inteiro do numeral romano
|
|
113
|
-
def r2i(numeral, ultimo)
|
|
114
|
-
return 0 if numeral.empty?
|
|
115
|
-
|
|
116
|
-
v = ROMAN[numeral[-1].to_sym]
|
|
117
|
-
v < ultimo ? (r2i(numeral.chop, v) - v) : (r2i(numeral.chop, v) + v)
|
|
118
|
-
end
|
|
119
89
|
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.
|
|
4
|
+
version: 0.6.0
|
|
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-11-
|
|
11
|
+
date: 2019-11-08 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -90,7 +90,8 @@ files:
|
|
|
90
90
|
- extenso_pt.gemspec
|
|
91
91
|
- lib/extenso_pt.rb
|
|
92
92
|
- lib/extenso_pt/constantes.rb
|
|
93
|
-
- lib/extenso_pt/
|
|
93
|
+
- lib/extenso_pt/extenso.rb
|
|
94
|
+
- lib/extenso_pt/romana.rb
|
|
94
95
|
- lib/extenso_pt/version.rb
|
|
95
96
|
homepage: https://github.com/hernanilr/extenso_pt
|
|
96
97
|
licenses:
|