class Amortizer::Loan

Attributes

decimals[RW]

Public Class Methods

new(principal, rate, term) click to toggle source
# File lib/amortizer/loan.rb, line 9
def initialize(principal, rate, term)
  @principal = principal
  @rate      = rate
  @term      = term

  @valid = convert_to_bigdecimals && validate_inputs if inputs_are_numbers
  @rate /= (12 * 100) if @valid
end

Public Instance Methods

payment() click to toggle source
# File lib/amortizer/loan.rb, line 18
def payment
  calculate_payment if @valid
end

Private Instance Methods

calculate_payment() click to toggle source
# File lib/amortizer/loan.rb, line 24
def calculate_payment
  if @rate == 0
    payment = (@principal / @term)
  else
    payment = @principal * ((@rate * ((1 + @rate) ** @term)) /
                                (((1 + @rate) ** @term) - 1))
  end
  payment.nan? ? nil : payment.to_f.round(@decimals || 2)
end
convert_to_bigdecimals() click to toggle source
# File lib/amortizer/loan.rb, line 42
def convert_to_bigdecimals
  @principal = @principal.to_d
  @rate      = @rate.to_d
  @term      = @term.to_d
end
inputs_are_numbers() click to toggle source
# File lib/amortizer/loan.rb, line 38
def inputs_are_numbers
  is_number?(@principal) && is_number?(@rate) && is_number?(@term)
end
is_number?(input) click to toggle source
# File lib/amortizer/loan.rb, line 34
def is_number?(input)
  true if Float(input) rescue false
end
validate_inputs() click to toggle source
# File lib/amortizer/loan.rb, line 48
def validate_inputs
  (@principal >= 0.0) && (@rate >= 0.0) && (@term >= 1.0)
end