class FuzzyMoney::Price

Constants

DEFAULT_DENOMINATED_ORDER
DEFAULT_NORMALIZATIONS

Attributes

denominated_order[R]
normalizations[R]
raw[R]

Public Class Methods

new(raw, options={}) click to toggle source
# File lib/fuzzy_money/price.rb, line 19
def initialize(raw, options={})
  if raw.is_a? String
    @raw = raw.clone.strip
  else
    @raw = ""
  end

  @normalizations = options.fetch(:normalizations, DEFAULT_NORMALIZATIONS)
  @denominated_order = options.fetch(:denominated_order, DEFAULT_DENOMINATED_ORDER)
end

Public Instance Methods

denominate(convert=:to_f) click to toggle source
# File lib/fuzzy_money/price.rb, line 69
def denominate(convert=:to_f)
  value = split[:value].send(convert)
  denomination = split[:denomination]

  if denominated_order[denomination] == :after
    "#{value}#{denomination}"
  else
    "#{denomination}#{value}"
  end
end
min() click to toggle source
# File lib/fuzzy_money/price.rb, line 54
def min
  if range?
    range[0]
  elsif multiple?
    multiple.sort { |p| p.normalized_float }.first
  else
    self
  end
end
multiple() click to toggle source
# File lib/fuzzy_money/price.rb, line 30
def multiple
  Array(
    raw.split('/')
     .map(&:strip)
     .map { |r| Price.new(r) }
  )
end
multiple?() click to toggle source
# File lib/fuzzy_money/price.rb, line 50
def multiple?
  multiple.size > 1
end
normalize() click to toggle source
# File lib/fuzzy_money/price.rb, line 64
def normalize
  return '' if split[:value].nil?
  min.denominate(:round)
end
normalized_float() click to toggle source
# File lib/fuzzy_money/price.rb, line 103
def normalized_float
  return 0.0 if split[:value].nil?
  split[:value] * normalizations[split[:denomination]]
end
range() click to toggle source
# File lib/fuzzy_money/price.rb, line 38
def range
  Array(
    raw.split('-')
     .map(&:strip)
     .map { |r| Price.new(r) }
  )
end
range?() click to toggle source
# File lib/fuzzy_money/price.rb, line 46
def range?
  range.size > 1
end
split() click to toggle source
# File lib/fuzzy_money/price.rb, line 80
def split
  denomination, value = \
    case raw
    when /C\$(\d+\.?\d{0,2})/ # Canadian
      ['C$', $1.to_f]
    when /\$(\d+\.?\d{0,2})/ # USA
      ['$', $1.to_f]
    when /€(\d+[\.,]?\d{0,2})/ # Leading Euro
      ['€', $1.to_f]
    when /(\d+[\.,]?\d{0,2})€/ # Trailing Euro
      ['€', $1.to_f]
    when /£(\d+[\.,]?\d{0,2})/ # Pounds
      ['£', $1.to_f]
    else
      [nil, nil]
    end

  {
    denomination: denomination,
    value: value
  }
end