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 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