Class Dinheiro
In: brdinheiro/lib/brdinheiro/dinheiro.rb
Parent: Object

Methods

Included Modules

Comparable

Constants

FORMATO_VALIDO_BR = /^([R|r]\$\s*)?(([+-]?\d{1,3}(\.?\d{3})*))?(\,\d{0,2})?$/
FORMATO_VALIDO_EUA = /^([R|r]\$\s*)?(([+-]?\d{1,3}(\,?\d{3})*))?(\.\d{0,2})?$/
SEPARADOR_MILHAR = "."
SEPARADOR_FRACIONARIO = ","
QUANTIDADE_DIGITOS = 3
PRECISAO_DECIMAL = 100

Attributes

quantia  [R] 

Public Class methods

[Source]

    # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 13
13:   def initialize(quantia)
14:     self.quantia = quantia
15:   end

Public Instance methods

Retorna a multiplicacao entre dinheiros.

Exemplo:

 5.reais * 2 == 10.reais
 5.reais * 2.reais == 10.reais

[Source]

    # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 75
75:   def *(outro)
76:     return Dinheiro.new(to_f * outro) unless outro.kind_of? Dinheiro
77:     outro * to_f
78:   end

Retorna a adicao entre dinheiros.

Exemplo:

 1.real + 1.real == 2.reais
 1.real + 1 == 2.reais

[Source]

    # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 57
57:   def +(outro)
58:     Dinheiro.new(transforma_em_string_que_represente_a_quantia(@quantia + quantia_de(outro)))
59:   end

Retorna a subtracao entre dinheiros.

Exemplo:

 10.reais - 2.reais == 8.reais
 10.reais - 2 == 8.reais

[Source]

    # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 66
66:   def -(outro)
67:     Dinheiro.new(transforma_em_string_que_represente_a_quantia(@quantia - quantia_de(outro)))
68:   end

Retorna a divisao entre dinheiros.

Exemplo:

 5.reais / 2 == (2.5).reais
 5.reais / 2.reais == DivisaPorNaoEscalarError
 5.reais / 0 == ZeroDivisionError

Veja também o método parcelar

[Source]

    # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 88
88:   def /(outro)
89:     raise DivisaPorNaoEscalarError unless outro.kind_of?(Numeric)
90:     return @quantia/outro if outro == 0
91:     Dinheiro.new(to_f / outro.to_f)
92:   end

Compara com outro dinheiro se eh maior ou menor.

Exemplo:

 1.real < 2.reais ==> true
 1.real > 2.reais ==> false
 2.real < 1.reais ==> false
 2.real > 1.reais ==> true

[Source]

    # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 47
47:   def <=>(outro_dinheiro)
48:     outro_dinheiro = Dinheiro.new(outro_dinheiro) unless outro_dinheiro.kind_of?(Dinheiro)
49:     @quantia <=> outro_dinheiro.quantia
50:   end

Compara com outro dinheiro se eh igual.

Exemplo:

 um_real = Dinheiro.new(1)
 um_real == Dinheiro.new(1) ==> true
 um_real == Dinheiro.new(2) ==> false

[Source]

    # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 31
31:   def ==(outro_dinheiro)
32:     begin 
33:       outro_dinheiro = Dinheiro.new(outro_dinheiro) unless outro_dinheiro.kind_of?(Dinheiro)
34:     rescue
35:       return false
36:     end
37:     @quantia == outro_dinheiro.quantia
38:   end

Retorna uma string formatada sem sigla.

Exemplo:

 Dinheiro.new(1).contabil ==> '1,00'
 Dinheiro.new(-1).contabil ==> '(1,00)'

[Source]

     # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 173
173:   def contabil
174:     if @quantia >= 0
175:       to_s      
176:     else  
177:       "(" + to_s[1..-1] + ")"    
178:     end  
179:   end

Retorna um array de dinheiro com as parcelas

Exemplo:

 6.reais.parcelar(2) == [3.reais, 3.reais]
 6.reais.parcelar(2.reais) == DisivaPorNaoEscalarError
 6.reais.parcelar(0) == ZeroDivisionError

[Source]

     # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 100
100:   def parcelar(numero_de_parcelar)
101:     raise DivisaPorNaoEscalarError unless numero_de_parcelar.kind_of?(Integer)
102:     resto = @quantia % numero_de_parcelar
103:     valor_menor = Dinheiro.new((@quantia/numero_de_parcelar)/100.0)
104:     valor_maior = Dinheiro.new((@quantia/numero_de_parcelar+1)/100.0)
105:     [valor_menor] * (numero_de_parcelar - resto) + [valor_maior] * resto
106:   end
por_extenso()

Alias for to_extenso

por_extenso_em_reais()

Alias for to_extenso

reais()

Alias for real

reais_contabeis()

Alias for real_contabil

reais_formatado()

Alias for real_formatado

Retorna a própria instância/

[Source]

     # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 138
138:   def real
139:     self
140:   end

Retorna uma string formatada com sigla em valor contábil.

Exemplo:

 Dinheiro.new(1).real_contabil ==> 'R$ 1,00'
 Dinheiro.new(-1).real_contabil ==> 'R$ (1,00)'

[Source]

     # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 161
161:   def real_contabil
162:     "R$ " + contabil
163:   end

Retorna uma string formatada com sigla em valor monetário. Exemplo:

 Dinheiro.new(1).real_formatado ==> 'R$ 1,00'
 Dinheiro.new(-1).real_formatado ==> 'R$ -1,00'

[Source]

     # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 149
149:   def real_formatado
150:     "R$ #{to_s}"
151:   end

Escreve o valor por extenso.

Exemplo:

 1.real.to_extenso ==> 'um real'
 (100.58).to_extenso ==> 'cem reais e cinquenta e oito centavos'

[Source]

     # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 113
113:   def to_extenso
114:     (@quantia/100.0).por_extenso_em_reais
115:   end

Retorna um Float.

[Source]

     # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 129
129:   def to_f
130:     to_s.gsub('.', '').gsub(',', '.').to_f
131:   end

Retorna o valor armazenado em string.

Exemplo:

 1000.to_s ==> '1.000,00'

[Source]

    # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 21
21:   def to_s
22:     inteiro_com_milhar(parte_inteira) + parte_decimal
23:   end

Verifica se o valor é zero.

[Source]

     # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 124
124:   def zero?
125:     to_f.zero?
126:   end

Private Instance methods

[Source]

     # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 268
268:   def decimal(parte_fracionaria)
269:     unless parte_fracionaria.blank?
270:       return sem_delimitador_decimal(parte_fracionaria) if parte_fracionaria.length == 3
271:       return sem_delimitador_decimal(parte_fracionaria) + "0" if parte_fracionaria.length == 2
272:     end
273:     "00"
274:   end

[Source]

     # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 241
241:   def digitos_que_sobraram(inteiro)
242:     inteiro.length - (quantidade_de_passos(inteiro) * QUANTIDADE_DIGITOS)
243:   end

[Source]

     # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 250
250:   def extrai_quantia_como_inteiro(quantia)
251:     if FORMATO_VALIDO_BR =~ quantia
252:       return sem_milhar($2, $5, '.')
253:     end
254:     if FORMATO_VALIDO_EUA =~ quantia 
255:       return sem_milhar($2, $5, ',')
256:     end
257:   end

[Source]

     # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 263
263:   def inteiro(inteiro_com_separador_milhar, separador)
264:     return inteiro_com_separador_milhar.gsub(separador, '') unless inteiro_com_separador_milhar.blank?
265:     ""
266:   end

[Source]

     # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 221
221:   def inteiro_com_milhar(inteiro)
222:     return inteiro if quantidade_de_passos(inteiro) == 0
223:     resultado = ""
224:     quantidade_de_passos(inteiro).times do |passo| 
225:       resultado = "." + inteiro[-QUANTIDADE_DIGITOS + passo * -QUANTIDADE_DIGITOS, QUANTIDADE_DIGITOS] + resultado            
226:     end
227:     resultado = inteiro[0, digitos_que_sobraram(inteiro)] + resultado
228:     resultado.gsub(/^(-?)\./, '\1')
229:   end

[Source]

     # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 217
217:   def parte_decimal
218:     quantia_sem_separacao_milhares[-QUANTIDADE_DIGITOS, QUANTIDADE_DIGITOS]
219:   end

[Source]

     # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 213
213:   def parte_inteira
214:     quantia_sem_separacao_milhares[0,quantia_sem_separacao_milhares.length-QUANTIDADE_DIGITOS]
215:   end

[Source]

     # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 206
206:   def quantia=(quantia)
207:     raise DinheiroInvalidoError unless quantia_valida?(quantia)
208:     quantia = quantia.to_f if quantia.kind_of?(BigDecimal)
209:     @quantia = (quantia * 100).round if quantia.kind_of?(Numeric)
210:     @quantia = extrai_quantia_como_inteiro(quantia) if quantia.kind_of?(String)
211:   end

[Source]

     # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 192
192:   def quantia_de(outro)
193:     outro = outro.to_f if outro.kind_of?(BigDecimal)
194:     return outro.quantia if outro.kind_of?(Dinheiro)
195:     (outro * 100).round
196:   end

[Source]

     # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 281
281:   def quantia_respeita_formato?(quantia)
282:     return true if FORMATO_VALIDO_BR.match(quantia) || FORMATO_VALIDO_EUA.match(quantia)
283:     false
284:   end

[Source]

     # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 231
231:   def quantia_sem_separacao_milhares
232:     sprintf("%.2f", (@quantia.to_f / PRECISAO_DECIMAL)).gsub(SEPARADOR_MILHAR, SEPARADOR_FRACIONARIO)
233:   end

[Source]

     # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 245
245:   def quantia_valida?(quantia)
246:     return false if quantia.kind_of?(String) && !quantia_respeita_formato?(quantia)
247:     quantia.kind_of?(String) || quantia.kind_of?(Numeric)
248:   end

[Source]

     # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 235
235:   def quantidade_de_passos(inteiro)
236:     resultado = inteiro.length / QUANTIDADE_DIGITOS
237:     resultado = (resultado - 1) if inteiro.length % QUANTIDADE_DIGITOS == 0
238:     resultado
239:   end

[Source]

     # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 276
276:   def sem_delimitador_decimal(parte_fracionaria)
277:     "#{parte_fracionaria}".gsub(/[.|,]/, '')
278:   end

[Source]

     # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 259
259:   def sem_milhar(parte_inteira, parte_decimal, delimitador_de_milhar)
260:     (inteiro(parte_inteira, delimitador_de_milhar) + decimal(parte_decimal)).to_i
261:   end

[Source]

     # File brdinheiro/lib/brdinheiro/dinheiro.rb, line 198
198:   def transforma_em_string_que_represente_a_quantia(quantia)
199:     if /^([+-]?)(\d)$/ =~ quantia.to_s
200:       return "#{$1}0.0#{$2}"
201:     end
202:     /^([+-]?)(\d*)(\d\d)$/ =~ quantia.to_s
203:     "#{$1}#{$2.to_i}.#{$3}"
204:   end

[Validate]