| Class | Dinheiro |
| In: |
brdinheiro/lib/brdinheiro/dinheiro.rb
|
| Parent: | Object |
| 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 |
| quantia | [R] |
# File brdinheiro/lib/brdinheiro/dinheiro.rb, line 13
13: def initialize(quantia)
14: self.quantia = quantia
15: end
Retorna a multiplicacao entre dinheiros.
Exemplo:
5.reais * 2 == 10.reais 5.reais * 2.reais == 10.reais
# 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
# 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
# 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
# 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
# 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
# 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)'
# 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
# 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
Retorna a própria instância/
# 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)'
# 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'
# 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'
# 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.
# 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'
# 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.
# File brdinheiro/lib/brdinheiro/dinheiro.rb, line 124
124: def zero?
125: to_f.zero?
126: end
# 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
# 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
# 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
# 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
# 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
# File brdinheiro/lib/brdinheiro/dinheiro.rb, line 217
217: def parte_decimal
218: quantia_sem_separacao_milhares[-QUANTIDADE_DIGITOS, QUANTIDADE_DIGITOS]
219: end
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# File brdinheiro/lib/brdinheiro/dinheiro.rb, line 276
276: def sem_delimitador_decimal(parte_fracionaria)
277: "#{parte_fracionaria}".gsub(/[.|,]/, '')
278: end
# 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