extenso_pt 0.5.8 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|