Class: Dinheiro
- Inherits:
-
Object
- Object
- Dinheiro
- Includes:
- Comparable
- Defined in:
- lib/brdinheiro/dinheiro.rb
Constant Summary collapse
- 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
Instance Attribute Summary collapse
-
#quantia ⇒ Object
readonly
Returns the value of attribute quantia.
Instance Method Summary collapse
-
#*(outro) ⇒ Object
Retorna a multiplicacao entre dinheiros.
-
#+(outro) ⇒ Object
Retorna a adicao entre dinheiros.
-
#-(outro) ⇒ Object
Retorna a subtracao entre dinheiros.
-
#/(outro) ⇒ Object
Retorna a divisao entre dinheiros.
-
#<=>(outro_dinheiro) ⇒ Object
Compara com outro dinheiro se eh maior ou menor.
-
#==(outro_dinheiro) ⇒ Object
Compara com outro dinheiro se eh igual.
-
#as_json ⇒ Object
Retorna o valor em Float quando uma coleção ou objeto é convertido para JSON.
-
#coerce(outro) ⇒ Object
:nodoc:.
-
#contabil ⇒ Object
Retorna uma string formatada sem sigla.
-
#initialize(quantia) ⇒ Dinheiro
constructor
A new instance of Dinheiro.
-
#method_missing(symbol, *args) ⇒ Object
Method missing para retorna um BigDecinal quando chamada .
-
#parcelar(numero_de_parcelar) ⇒ Object
Retorna um array de dinheiro com as parcelas.
-
#real ⇒ Object
(also: #reais)
Retorna a própria instância/.
-
#real_contabil ⇒ Object
(also: #reais_contabeis)
Retorna uma string formatada com sigla em valor contábil.
-
#real_formatado ⇒ Object
(also: #reais_formatado)
Retorna uma string formatada com sigla em valor monetário.
-
#to_extenso ⇒ Object
(also: #por_extenso, #por_extenso_em_reais)
Escreve o valor por extenso.
-
#to_f ⇒ Object
Retorna um Float.
-
#to_s ⇒ Object
Retorna o valor armazenado em string.
-
#zero? ⇒ Boolean
Verifica se o valor é zero.
Constructor Details
#initialize(quantia) ⇒ Dinheiro
Returns a new instance of Dinheiro.
13 14 15 |
# File 'lib/brdinheiro/dinheiro.rb', line 13 def initialize(quantia) self.quantia = quantia end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(symbol, *args) ⇒ Object
Method missing para retorna um BigDecinal quando chamada .
192 193 194 195 196 197 198 199 |
# File 'lib/brdinheiro/dinheiro.rb', line 192 def method_missing(symbol, *args) #:nodoc: #Ex: Chama ao método valor_decimal() if (symbol.to_s =~ /^(.*)_decimal$/) && args.size == 0 BigDecimal.new quantia_sem_separacao_milhares.gsub(',','.') else super.method_missing(symbol, *args) end end |
Instance Attribute Details
#quantia ⇒ Object
Returns the value of attribute quantia.
4 5 6 |
# File 'lib/brdinheiro/dinheiro.rb', line 4 def quantia @quantia end |
Instance Method Details
#*(outro) ⇒ Object
Retorna a multiplicacao entre dinheiros.
Exemplo:
5.reais * 2 == 10.reais
5.reais * 2.reais == 10.reais
85 86 87 88 |
# File 'lib/brdinheiro/dinheiro.rb', line 85 def *(outro) return Dinheiro.new(to_f * outro) unless outro.kind_of? Dinheiro outro * to_f end |
#+(outro) ⇒ Object
Retorna a adicao entre dinheiros.
Exemplo:
1.real + 1.real == 2.reais
1.real + 1 == 2.reais
67 68 69 |
# File 'lib/brdinheiro/dinheiro.rb', line 67 def +(outro) Dinheiro.new(transforma_em_string_que_represente_a_quantia(@quantia + quantia_de(outro))) end |
#-(outro) ⇒ Object
Retorna a subtracao entre dinheiros.
Exemplo:
10.reais - 2.reais == 8.reais
10.reais - 2 == 8.reais
76 77 78 |
# File 'lib/brdinheiro/dinheiro.rb', line 76 def -(outro) Dinheiro.new(transforma_em_string_que_represente_a_quantia(@quantia - quantia_de(outro))) end |
#/(outro) ⇒ Object
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
98 99 100 101 102 |
# File 'lib/brdinheiro/dinheiro.rb', line 98 def /(outro) raise DivisaPorNaoEscalarError unless outro.kind_of?(Numeric) return @quantia/outro if outro == 0 Dinheiro.new(to_f / outro.to_f) end |
#<=>(outro_dinheiro) ⇒ Object
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
57 58 59 60 |
# File 'lib/brdinheiro/dinheiro.rb', line 57 def <=>(outro_dinheiro) outro_dinheiro = Dinheiro.new(outro_dinheiro) unless outro_dinheiro.kind_of?(Dinheiro) @quantia <=> outro_dinheiro.quantia end |
#==(outro_dinheiro) ⇒ Object
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
41 42 43 44 45 46 47 48 |
# File 'lib/brdinheiro/dinheiro.rb', line 41 def ==(outro_dinheiro) begin outro_dinheiro = Dinheiro.new(outro_dinheiro) unless outro_dinheiro.kind_of?(Dinheiro) rescue return false end @quantia == outro_dinheiro.quantia end |
#as_json ⇒ Object
Retorna o valor em Float quando uma coleção ou objeto é convertido para JSON
Exemplo:
produto = Produto.find 1
produto.to_json // {"nome": "MacBook", "valor": 3500.0}
23 24 25 |
# File 'lib/brdinheiro/dinheiro.rb', line 23 def as_json self.to_f end |
#coerce(outro) ⇒ Object
:nodoc:
143 144 145 |
# File 'lib/brdinheiro/dinheiro.rb', line 143 def coerce(outro)#:nodoc: [ Dinheiro.new(outro), self ] end |
#contabil ⇒ Object
Retorna uma string formatada sem sigla.
Exemplo:
Dinheiro.new(1).contabil ==> '1,00'
Dinheiro.new(-1).contabil ==> '(1,00)'
183 184 185 186 187 188 189 |
# File 'lib/brdinheiro/dinheiro.rb', line 183 def contabil if @quantia >= 0 to_s else "(" + to_s[1..-1] + ")" end end |
#parcelar(numero_de_parcelar) ⇒ Object
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
110 111 112 113 114 115 116 |
# File 'lib/brdinheiro/dinheiro.rb', line 110 def parcelar(numero_de_parcelar) raise DivisaPorNaoEscalarError unless numero_de_parcelar.kind_of?(Integer) resto = @quantia % numero_de_parcelar valor_menor = Dinheiro.new((@quantia/numero_de_parcelar)/100.0) valor_maior = Dinheiro.new((@quantia/numero_de_parcelar+1)/100.0) [valor_menor] * (numero_de_parcelar - resto) + [valor_maior] * resto end |
#real ⇒ Object Also known as: reais
Retorna a própria instância/
148 149 150 |
# File 'lib/brdinheiro/dinheiro.rb', line 148 def real self end |
#real_contabil ⇒ Object Also known as: reais_contabeis
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)'
171 172 173 |
# File 'lib/brdinheiro/dinheiro.rb', line 171 def real_contabil "R$ " + contabil end |
#real_formatado ⇒ Object Also known as: reais_formatado
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'
159 160 161 |
# File 'lib/brdinheiro/dinheiro.rb', line 159 def real_formatado "R$ #{to_s}" end |
#to_extenso ⇒ Object Also known as: por_extenso, por_extenso_em_reais
Escreve o valor por extenso.
Exemplo:
1.real.to_extenso ==> 'um real'
(100.58).to_extenso ==> 'cem reais e cinquenta e oito centavos'
123 124 125 |
# File 'lib/brdinheiro/dinheiro.rb', line 123 def to_extenso (@quantia/100.0).por_extenso_em_reais end |
#to_f ⇒ Object
Retorna um Float.
139 140 141 |
# File 'lib/brdinheiro/dinheiro.rb', line 139 def to_f to_s.gsub('.', '').gsub(',', '.').to_f end |
#to_s ⇒ Object
Retorna o valor armazenado em string.
Exemplo:
1000.to_s ==> '1.000,00'
31 32 33 |
# File 'lib/brdinheiro/dinheiro.rb', line 31 def to_s inteiro_com_milhar(parte_inteira) + parte_decimal end |
#zero? ⇒ Boolean
Verifica se o valor é zero.
134 135 136 |
# File 'lib/brdinheiro/dinheiro.rb', line 134 def zero? to_f.zero? end |