class Money

Attributes

amount[RW]
conversion[RW]
currency[RW]

Public Class Methods

new(amount, currency = nil) click to toggle source
# File lib/moneygm.rb, line 3
def initialize(amount, currency = nil)
  @amount = amount
  @currency = currency || "EUR" #Si no hay moneda definida, la default es EUR
  @conversion = { 'USD' => 1.11, 'Bitcoin' => 0.0047 } if @currency == "EUR"
  @conversion = { 'EUR' => 0.90, 'Bitcoin' => 0.00423 } if @currency == "USD"
  @conversion = { 'EUR' => 212.76, 'USD' => 236.16 } if @currency == "Bitcoin"
end

Public Instance Methods

*(multiplier) click to toggle source

Para la multiplicacion y la division se asume que los parametros seran valores numericos y no un objeto

# File lib/moneygm.rb, line 58
def * (multiplier)
  value = self.amount * multiplier
  "#{value} #{self.currency}"
end
+(object_to_add) click to toggle source

Para la suma y la resta se asume que siempre seran dos objetos de tipo Money y que si las monedas son diferentes la conversion se hara a EUR

# File lib/moneygm.rb, line 35
def + (object_to_add)
  if self.currency == object_to_add.currency
    value = self.amount + object_to_add.amount
    "#{value} #{self.currency}"
  else
    value = self.convert_to('EUR').amount + object_to_add.convert_to('EUR').amount
    "#{value} EUR"
  end
end
-(obj_to_substract) click to toggle source
# File lib/moneygm.rb, line 45
def - (obj_to_substract)
  if self.currency == obj_to_substract.currency
    value = self.amount - obj_to_substract.amount
    # se coloca el valor absoluto (value.abs) ya que si restas dos monedas (ej 2 billetes) no queda un saldo negativo, sin importar el orden de los factores
    "#{value.abs} #{self.currency}"
  else
    value = self.convert_to('EUR').amount - obj_to_substract.convert_to('EUR').amount
    "#{value.abs} EUR"
  end
end
/(divider) click to toggle source
# File lib/moneygm.rb, line 63
def / (divider)
  value = self.amount / divider
  "#{value} #{self.currency}"
end
<(obj) click to toggle source
# File lib/moneygm.rb, line 79
def < (obj)
  value = self.convert_to('EUR').amount < obj.convert_to('EUR').amount ? true : false
end
==(obj) click to toggle source

Solo se consideran los operadores == , >, <

# File lib/moneygm.rb, line 71
def == (obj)
  value = self.convert_to('EUR').amount == obj.convert_to('EUR').amount ? true : false
end
>(obj) click to toggle source
# File lib/moneygm.rb, line 75
def > (obj)
  value = self.convert_to('EUR').amount > obj.convert_to('EUR').amount ? true : false
end
convert_to(currency_to_convert) click to toggle source

Retorna una copia del objeto con la conversion solicitada, si la moneda no existe retorna el obj inicial

# File lib/moneygm.rb, line 16
def convert_to(currency_to_convert)
  obj_copy = self.dup #copio el objeto
  return obj_copy if self.conversion[currency_to_convert].nil? || currency_to_convert == self.currency
  case currency_to_convert
    when "USD"
      obj_copy.amount = (obj_copy.amount * obj_copy.conversion['USD']).round(2)
    when "Bitcoin"
      obj_copy.amount = (obj_copy.amount * obj_copy.conversion['Bitcoin']).round(2)
    when "EUR"
      obj_copy.amount =  (obj_copy.amount * obj_copy.conversion['EUR']).round(2)
  end
  obj_copy.currency = currency_to_convert
  return obj_copy
end
inspect() click to toggle source
# File lib/moneygm.rb, line 11
def inspect
  "#{@amount} #{@currency}"
end