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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a8e97d447bc5d00e4399120531cb4e8307559084dfc8d42ed36af0bc4d2e645a
4
- data.tar.gz: c3190c47b494f8150e7932a7026bbcf959f41a2e6fb3de8eddad47b2a890aa9a
3
+ metadata.gz: b4ecd20ca98d2a1e97e2758d71044a65707f78ea2c0d8267270970d1272690c1
4
+ data.tar.gz: b101adfafc3c7e3a645efbae2043c5f28ce0f306680ab738f76c9dd79dab2a4e
5
5
  SHA512:
6
- metadata.gz: '0910a98969f0ab858925dcab97c9411c61d060fc756f61bb494edd889b67f432ba6cbdc123fb754291f89f46b630c81057e3224e293cea7acde47cfb537366fb'
7
- data.tar.gz: 2fb1cdd88909bd35a61de3572ce59b262251a397b6b7a794f6117d11b45a370e6e2f4952475e75669ab37fe7743f91fd9fb313c16858e07ef2a8404ba62076be
6
+ metadata.gz: 8cf77fe008993545c009e84a7a91fc69d503ff009317a797191c957dc230d4513ac6a4e7fbb13489c728ce69b3a25ab307e3bdef5950e6ed7a38a7d820c646d3
7
+ data.tar.gz: 1fb8a33165853d1adec4b5056ec97aa4996a664a4cc1d2fed0bad89142dded83508537b4691c719d0e4d396cf0dbbf4c273f1aeca537ce882aad81ff990232f3
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- extenso_pt (0.4.4)
4
+ extenso_pt (0.5.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -1,3 +1,3 @@
1
1
  module ExtensoPt
2
- VERSION = "0.4.4"
2
+ VERSION = "0.5.0"
3
3
  end
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 <mil>
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&&mil%100>0?" E ":"")+
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 da parte inteira do valor monetário em portugûes de portugal ou brasil.
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 em tratamento
46
- # @param [String] ext extenso actual em tratamento
47
- # @return [String] o extenso da parte inteira do valor monetário
48
- def self.einteira(pos=0,ext="")
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
- ext
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
- ctl=pos>0?@@ai[pos-1]:0
53
- ext=e999(@@ai[pos],pos)+A1e24[@@lc][@@ai[pos]>0?@@ai[pos]>1?8+pos:pos:0]+(ctl>100?" ":ctl>0?" E ":"")+ext
54
- einteira(pos+1,ext)
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 no seu extenso em portugûes de portugal ou brasil.
67
+ # Converte um objeto criando extenso(s) em portugûes de portugal ou brasil.
59
68
  #
60
- # @param [Hash] moeda as opcoes para parametrizar a moeda/fração
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 extenso(moeda={lc:(:pt),msingular:"EURO",fsingular:"CÊNTIMO"})
68
- # parametrização da moeda
69
- moeda={lc:(:br),msingular:"REAL",mplural:"REAIS",fsingular:"CENTAVO"} if (moeda[:lc]==:br&&!moeda[:mplural]&&!moeda[:fplural])
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
- self.map{|k,v|[k,v.extenso(lc:(@@lc),msingular:@@ms,fsingular:@@cs,mplural:@@mp,fplural:@@cp)]}.to_h
78
- elsif (self.respond_to?:to_a)
79
- # converte o objecto num Array e converte os valores nos seus extensos - devolve um Array
80
- self.to_a.map{|a|a.extenso(lc:(@@lc),msingular:@@ms,fsingular:@@cs,mplural:@@mp,fplural:@@cp)}
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
- # converter com bigdecimal/util para evitar bugs com valores superiores a 1e12
83
- n=self.to_d.to_s('F')
84
- # dividir parte inteira em grupos de 3 digitos ex: 123022.12 => [22, 123]
85
- @@ai=n[/^\d+/].to_s.reverse.scan(/\d{1,3}/).map{|i|i.reverse.to_i}
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
- "" # MAX 1e24
93
+ ""
88
94
  else
89
- ExtensoPt.einteira+
90
- # parte fracionária é arredondada a 2 casas decimais (cêntimos)
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.4
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-20 00:00:00.000000000 Z
11
+ date: 2019-09-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler