extenso_pt 0.4.4 → 0.5.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/version.rb +1 -1
- data/lib/extenso_pt.rb +115 -54
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b4ecd20ca98d2a1e97e2758d71044a65707f78ea2c0d8267270970d1272690c1
|
|
4
|
+
data.tar.gz: b101adfafc3c7e3a645efbae2043c5f28ce0f306680ab738f76c9dd79dab2a4e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8cf77fe008993545c009e84a7a91fc69d503ff009317a797191c957dc230d4513ac6a4e7fbb13489c728ce69b3a25ab307e3bdef5950e6ed7a38a7d820c646d3
|
|
7
|
+
data.tar.gz: 1fb8a33165853d1adec4b5056ec97aa4996a664a4cc1d2fed0bad89142dded83508537b4691c719d0e4d396cf0dbbf4c273f1aeca537ce882aad81ff990232f3
|
data/Gemfile.lock
CHANGED
data/lib/extenso_pt/version.rb
CHANGED
data/lib/extenso_pt.rb
CHANGED
|
@@ -15,84 +15,145 @@ module ExtensoPt
|
|
|
15
15
|
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"],
|
|
16
16
|
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"]}
|
|
17
17
|
|
|
18
|
-
# Produz a moeda e o extenso da parte fracionária do valor monetário em portugûes de portugal ou brasil.
|
|
19
|
-
#
|
|
20
|
-
# @param [Integer] fracao parte fracionária do valor monetário ex: 100022.12 = 12
|
|
21
|
-
# @return [String] a moeda e o extenso da parte fracionária do valor monetário
|
|
22
|
-
def self.efracao(fracao)
|
|
23
|
-
inteira=@@ai.find{|v|v>0}.to_i+@@ai[1..-1].to_a.find{|v|v>0}.to_i
|
|
24
|
-
total=inteira+fracao
|
|
25
|
-
(@@ai[2..-1].to_a.find{|v|v>0}.to_i>0&&@@ai[0..1].inject(:+).to_i==0?" DE":@@ai.count>0&&total==0?"ZERO "+@@mp:"")+
|
|
26
|
-
(inteira>0?inteira>1?" "+@@mp:" "+@@ms:"")+
|
|
27
|
-
(inteira>0&&fracao>0?" E ":"")+e999(fracao)+
|
|
28
|
-
(fracao>0?fracao>1?" "+@@cp:" "+@@cs:"")
|
|
29
|
-
end
|
|
30
|
-
|
|
31
18
|
# Produz o extenso dum grupo de 3 digitos em portugûes de portugal ou brasil.
|
|
32
19
|
#
|
|
33
20
|
# @param [Integer] mil o valor dum grupo de 3 digitos a converter
|
|
34
21
|
# @param [Integer] pos posição deste grupo de 3 digitos no valor monetário em tratamento
|
|
35
|
-
# @return [String] o extenso de
|
|
22
|
+
# @return [String] o extenso dum grupo de 3 digitos
|
|
36
23
|
def self.e999(mil,pos=0)
|
|
37
24
|
cem=mil%100
|
|
38
|
-
A1000[@@lc][(mil>100?1:0)+mil/100]+(mil>100&&
|
|
39
|
-
A0100[@@lc][cem/10]+(mil>20&&mil%10>0?" E ":"")+
|
|
40
|
-
A0020[@@lc][pos==1&&mil==1?0:cem<20?cem:cem%10]
|
|
25
|
+
A1000[@@lc][(mil>100?1:0)+mil/100]+(mil>100&&cem>0?" E ":"")+ # extenso das centenas
|
|
26
|
+
A0100[@@lc][cem/10]+(mil>20&&mil%10>0?" E ":"")+ # extenso dos dezenas
|
|
27
|
+
A0020[@@lc][pos==1&&mil==1?0:cem<20?cem:cem%10] # extenso das unidades mais 10-19
|
|
41
28
|
end
|
|
42
29
|
|
|
43
|
-
# Produz o extenso
|
|
30
|
+
# Produz o extenso dum valor monetário em portugûes de portugal ou brasil.
|
|
44
31
|
#
|
|
45
|
-
# @param [Integer] pos posição actual nos grupos de 3 digitos do valor monetário
|
|
46
|
-
# @param [String] ext extenso actual em
|
|
47
|
-
# @return [String] o extenso
|
|
48
|
-
def self.
|
|
32
|
+
# @param [Integer] pos posição actual nos grupos de 3 digitos do valor monetário
|
|
33
|
+
# @param [String] ext extenso actual em construção
|
|
34
|
+
# @return [String] o extenso dum valor monetário
|
|
35
|
+
def self.enumerico(pos=0,ext="")
|
|
36
|
+
|
|
37
|
+
# testa fim do valor monetário
|
|
49
38
|
if (pos>=@@ai.count)
|
|
50
|
-
|
|
39
|
+
|
|
40
|
+
# soma os grupos de 3 digitos para controle de singular/plural
|
|
41
|
+
so1=@@ai[0].to_i+@@ai[1].to_i*2 # primeiros dois grupos
|
|
42
|
+
so2=@@ai[2..-1].to_a.inject(:+).to_i*2 # restantes grupos
|
|
43
|
+
|
|
44
|
+
if (so1+so2+@@nf==0)
|
|
45
|
+
"ZERO "+@@mp # caso especial de zero
|
|
46
|
+
else
|
|
47
|
+
ext+=" DE" if (so2>0&&so1==0) # proposição DE para valores >1e6 mas 0 nos primeiros 6 digitos
|
|
48
|
+
ext+=" "+@@ms if (so1+so2==1) # singular da moeda
|
|
49
|
+
ext+=" "+@@mp if (so1+so2>1) # plural da moeda
|
|
50
|
+
ext+=" E " if (so1+so2>0&&@@nf>0) # proposição E entre parte inteira e parte fracionária
|
|
51
|
+
ext+=e999(@@nf) # extenso da parte fracionária
|
|
52
|
+
ext+=" "+@@cs if (@@nf==1) # singular da parte fracionária
|
|
53
|
+
ext+=" "+@@cp if (@@nf>1) # plural da parte fracionária
|
|
54
|
+
ext
|
|
55
|
+
end
|
|
51
56
|
else
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
57
|
+
# extenso do grupo actual de 3 digitos
|
|
58
|
+
dg3 =e999(@@ai[pos],pos)
|
|
59
|
+
dg3+=A1e24[@@lc][@@ai[pos]>0?@@ai[pos]>1?8+pos:pos:0] # qualificador do grupo actual
|
|
60
|
+
dg3+=pos>0?@@ai[pos-1]>100?" ":@@ai[pos-1]>0?" E ":"":"" # separação entre grupo actual e anterior
|
|
61
|
+
|
|
62
|
+
# proximo grupo de 3 digitos
|
|
63
|
+
enumerico(pos+1,dg3+ext)
|
|
55
64
|
end
|
|
56
65
|
end
|
|
57
66
|
|
|
58
|
-
# Converte um objeto
|
|
67
|
+
# Converte um objeto criando extenso(s) em portugûes de portugal ou brasil.
|
|
59
68
|
#
|
|
60
|
-
# @param [
|
|
61
|
-
# @option moeda [Symbol] :lc locale do extenso - portugûes de portugal (:pt) ou brasil (:br)
|
|
62
|
-
# @option moeda [String] :msingular Moeda no singular - pode ser inferido do <b>:mplural menos "S"</b>
|
|
63
|
-
# @option moeda [String] :fsingular Fração no singular - pode ser inferido do <b>:fplural menos "S"</b>
|
|
64
|
-
# @option moeda [String] :mplural Moeda no plural - pode ser inferido do <b>:msingular+"S"</b>
|
|
65
|
-
# @option moeda [String] :fplural Fração no plural - pode ser inferido do <b>:fsingular+"S"</b>
|
|
69
|
+
# @param [Object] objeto o objeto a converter pode ser (String, Float, Integer, Array, Range, Hash) ou uma mistura
|
|
66
70
|
# @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)
|
|
67
|
-
def
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
@@lc=LC.include?(moeda[:lc])?moeda[:lc]:(:pt)
|
|
71
|
-
@@ms=moeda[:msingular]?moeda[:msingular]:moeda[:mplural].to_s[-1]=="S"?moeda[:mplural][0..-2]:"EURO"
|
|
72
|
-
@@cs=moeda[:fsingular]?moeda[:fsingular]:moeda[:fplural].to_s[-1]=="S"?moeda[:fplural][0..-2]:"CÊNTIMO"
|
|
73
|
-
@@mp=moeda[:mplural]?moeda[:mplural]:@@ms+"S"
|
|
74
|
-
@@cp=moeda[:fplural]?moeda[:fplural]:@@cs+"S"
|
|
75
|
-
if (self.kind_of?Hash)
|
|
71
|
+
def self.eobjeto(obj)
|
|
72
|
+
|
|
73
|
+
if (obj.kind_of?Hash)
|
|
76
74
|
# converte os valores do Hash nos seus extensos mantendo as chaves - devolve um Hash
|
|
77
|
-
|
|
78
|
-
elsif (
|
|
79
|
-
# converte o objecto num Array e converte os valores nos seus extensos - devolve um Array
|
|
80
|
-
|
|
75
|
+
obj.map{|k,v|[k,eobjeto(v)]}.to_h
|
|
76
|
+
elsif (obj.respond_to?:to_a)
|
|
77
|
+
# converte o objecto num Array e converte os valores do Array nos seus extensos - devolve um Array
|
|
78
|
+
obj.to_a.map{|a|eobjeto(a)}
|
|
81
79
|
else
|
|
82
|
-
#
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
80
|
+
# converte objeto numa string de digitos usando bigdecimal/util para evitar bugs com valores superiores a 1e12
|
|
81
|
+
# qualquer valor não convertivel (ex: texto) resulta em "0.0"
|
|
82
|
+
svalor=obj.to_d.to_s('F')
|
|
83
|
+
|
|
84
|
+
# array da parte inteira do valor monetário dividido em grupos de 3 digitos ex: 123022.12 => [22, 123]
|
|
85
|
+
@@ai=svalor[/^\d+/].to_s.reverse.scan(/\d{1,3}/).map{|i|i.reverse.to_i}
|
|
86
|
+
|
|
87
|
+
# parte fracionária do valor monetário ex: 123022.12 => 12
|
|
88
|
+
# arredondada a 2 casas decimais (cêntimos/centavos)
|
|
89
|
+
@@nf=(svalor[/\.\d*/].to_f*100).round
|
|
90
|
+
|
|
91
|
+
# valores superiores a 1e24 não são tratados
|
|
86
92
|
if (@@ai.count>8)
|
|
87
|
-
""
|
|
93
|
+
""
|
|
88
94
|
else
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
ExtensoPt.efracao((n[/\.\d*/].to_f*100).round)
|
|
95
|
+
# extenso num numerico
|
|
96
|
+
enumerico
|
|
92
97
|
end
|
|
93
98
|
end
|
|
94
99
|
end
|
|
95
100
|
|
|
101
|
+
# Produz extenso(s) de objeto(s) em portugûes de portugal ou brasil.
|
|
102
|
+
#
|
|
103
|
+
# @param [Hash] moeda as opcoes para parametrizar a moeda/fração
|
|
104
|
+
# @option moeda [Symbol] :lc locale do extenso - portugûes de portugal (:pt) ou brasil (:br)
|
|
105
|
+
# @option moeda [String] :msingular moeda no singular - pode ser inferido do plural menos "S"
|
|
106
|
+
# @option moeda [String] :fsingular fração no singular - pode ser inferido do plural menos "S"
|
|
107
|
+
# @option moeda [String] :mplural moeda no plural - pode ser inferido do singular mais "S"
|
|
108
|
+
# @option moeda [String] :fplural fração no plural - pode ser inferido do singular mais "S"
|
|
109
|
+
# @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)
|
|
110
|
+
def extenso(moeda={lc:(:pt),msingular:"EURO",fsingular:"CÊNTIMO"})
|
|
111
|
+
|
|
112
|
+
# parametrização por defeito para locale => :br
|
|
113
|
+
if (moeda[:lc]==:br&&!moeda[:mplural]&&!moeda[:fplural])
|
|
114
|
+
moeda={lc:(:br),msingular:"REAL",mplural:"REAIS",fsingular:"CENTAVO"}
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# se locale nao for [:pt,:br] entao :pt
|
|
118
|
+
if (LC.include?moeda[:lc])
|
|
119
|
+
@@lc=moeda[:lc]
|
|
120
|
+
else
|
|
121
|
+
@@lc=:pt
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# inferir singular da moeda a partir do plural
|
|
125
|
+
if (moeda[:msingular])
|
|
126
|
+
@@ms=moeda[:msingular]
|
|
127
|
+
elsif (moeda[:mplural].to_s[-1]=="S")
|
|
128
|
+
@@ms=moeda[:mplural][0..-2]
|
|
129
|
+
else
|
|
130
|
+
@@ms="EURO"
|
|
131
|
+
end
|
|
132
|
+
# inferir singular da fração a partir do plural
|
|
133
|
+
if (moeda[:fsingular])
|
|
134
|
+
@@cs=moeda[:fsingular]
|
|
135
|
+
elsif (moeda[:fplural].to_s[-1]=="S")
|
|
136
|
+
@@cs=moeda[:fplural][0..-2]
|
|
137
|
+
else
|
|
138
|
+
@@cs="CÊNTIMO"
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# inferir plural da moeda a partir do singular
|
|
142
|
+
if (moeda[:mplural])
|
|
143
|
+
@@mp=moeda[:mplural]
|
|
144
|
+
else
|
|
145
|
+
@@mp=@@ms+"S"
|
|
146
|
+
end
|
|
147
|
+
# inferir plural da fração a partir do singular
|
|
148
|
+
if (moeda[:fplural])
|
|
149
|
+
@@cp=moeda[:fplural]
|
|
150
|
+
else
|
|
151
|
+
@@cp=@@cs+"S"
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
# extenso do objeto
|
|
155
|
+
ExtensoPt.eobjeto(self)
|
|
156
|
+
end
|
|
96
157
|
end
|
|
97
158
|
class Hash; include ExtensoPt;end
|
|
98
159
|
class Array; include ExtensoPt;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.5.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-09-
|
|
11
|
+
date: 2019-09-21 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|