Module: Unity::Fraction

Extended by:
ActiveSupport::Concern
Included in:
Conversion, Dimension::Vector
Defined in:
lib/unity/fraction.rb

Defined Under Namespace

Modules: ClassMethods

Instance Method Summary collapse

Instance Method Details

#expanded_denominatorObject



53
54
55
# File 'lib/unity/fraction.rb', line 53

def expanded_denominator
  expand_unit_array denominator
end

#expanded_numeratorObject



49
50
51
# File 'lib/unity/fraction.rb', line 49

def expanded_numerator
  expand_unit_array numerator
end

#expressionObject



39
40
41
42
# File 'lib/unity/fraction.rb', line 39

def expression
  numertor_string = ([value] + (numerator || [])).join('*')
  denominator.empty? ? numertor_string : "#{numertor_string}/#{denominator.join('*')}"
end

#expression=(string) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/unity/fraction.rb', line 24

def expression=string
  unless string.blank?
    num_denom = string.split('/')
    raise(InvalidFormat, string) if num_denom.length > 2
    self.numerator = num_denom[0].split('*').map(&:strip)
    self.denominator = (num_denom[1].nil? ? [] : num_denom[1].split('*')).map(&:strip)
    self.value = extract_value!(:numerator) / extract_value!(:denominator)
    reduce
  else
    self.value = 0.0
    self.numerator = []
    self.denominator = []
  end
end

#initialize(*args) ⇒ Object



17
18
19
20
21
# File 'lib/unity/fraction.rb', line 17

def initialize *args
  self.value ||= 0.0
  self.numerator ||= []
  self.denominator ||= []
end

#inverseObject



57
58
59
60
# File 'lib/unity/fraction.rb', line 57

def inverse
  new_value = value == 0.0 ? 0.0 : 1.0 / value
  self.class.new :value => new_value, :numerator => denominator, :denominator => numerator
end

#reduceObject



62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/unity/fraction.rb', line 62

def reduce
  expand

  self.denominator.delete_if do |unit|  
    if nindex = self.numerator.index(unit)
      self.numerator.delete_at(nindex)
    end
  end

  self.numerator = reduce_unit_array(self.numerator)
  self.denominator = reduce_unit_array(self.denominator)

end

#unitObject



44
45
46
47
# File 'lib/unity/fraction.rb', line 44

def unit
  numertor_string = (numerator.blank? && !denominator.blank?) ? '1.0' : (numerator || []).join('*')
  denominator.blank? ? numertor_string : "#{numertor_string}/#{denominator.join('*')}"
end