extenso_pt 0.4.4 → 0.5.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/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
|