Sha256: 16397f5e08f7a80e38f458d34af4d18a205caaed68f378ccbf79cc336e7d96ca

Contents?: true

Size: 1.48 KB

Versions: 1

Compression:

Stored size: 1.48 KB

Contents

module Percentable
  class Percent < ::Numeric
    def initialize(value)
      if value.is_a? Percent
        @value = value.value
      else
        @value = value.to_f
      end
    end

    def value
      @value ||= 0.to_f
    end

    def to_s
      '%g%%' % value
    end

    def to_f
      value/100
    end

    def to_i
      value.to_i
    end

    def == other
      (other.class == self.class && other.value == self.value) || other == self.to_f
    end

    def eql? other
      self.send(:==, other)
    end

    def <=> other
      to_f <=> other.to_f
    end

    def * other
      case other
      when Percent
        self.class.new(to_f * other.value)
      else
        self.class.new(value * other.to_f)
      end
    end

    [:+, :-, :/].each do |operator|
      define_method operator do |other|
        case other
        when Percent
          self.class.new(value.public_send(operator, other.value))
        when Numeric
          self.class.new(value.public_send(operator, other))
        end
      end
    end

    def to_percent
      self
    end

    def self.from_numeric(numeric)
      case numeric
      when Numeric
        Percent.new(numeric*100)
      else
        fail TypeError, 'must inherit from Numeric'
      end
    end

    def coerce other
      case other
      when Numeric
        [CoercedPercent.new(self), other]
      else
        fail TypeError, "#{self.class} can't be coerced into #{other.class}"
      end
    end
  end
end

Percent = Percentable::Percent

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
percentable-1.0.1 lib/percentable/percent.rb