class CoinDecimal

Constants

BITCOIN_PRECISION
MAX_PRECISION

Attributes

precision[R]
value[R]

Public Class Methods

ensure_integer(value, precision = BITCOIN_PRECISION) click to toggle source
# File lib/coin_decimal.rb, line 27
def self.ensure_integer(value, precision = BITCOIN_PRECISION)
  if value.is_a?(Integer)
    value
  elsif value.is_a?(BigDecimal)
    (value * (10 ** precision)).to_i
  elsif value.is_a?(String)
    (value.to_d * (10 ** precision)).to_i
  else
    raise(ArgumentError, "Value must be Integer, BigDecimal or String.")
  end
end
new(value, precision = BITCOIN_PRECISION) click to toggle source
# File lib/coin_decimal.rb, line 13
def initialize(value, precision = BITCOIN_PRECISION)
  raise(ArgumentError, "Precision must be an Integer.") unless precision.is_a?(Integer)

  raise(ArgumentError, "Precision must be less than or equal to #{MAX_PRECISION}.") if precision > MAX_PRECISION

  raise(ArgumentError, "Precision can't be negative.") if precision < 0

  @precision = precision

  raise(ArgumentError, "Value can't be nil.") if value.nil?

  @value = CoinDecimal.ensure_integer(value, precision)
end

Public Instance Methods

+(addend) click to toggle source
# File lib/coin_decimal.rb, line 39
def +(addend)
  sum = value + addend.value
  CoinDecimal.new(sum, precision)
end
-(subtrahend) click to toggle source
# File lib/coin_decimal.rb, line 44
def -(subtrahend)
  difference = value - subtrahend.value
  CoinDecimal.new(difference, precision)
end
formatted(short: true) click to toggle source
# File lib/coin_decimal.rb, line 49
def formatted(short: true)
  result = string

  if short
    result = result.gsub(/0+$/, "")
    result = "#{result}0" if result.end_with?(".")
  end

  result
end
Also aliased as: to_s
negative?() click to toggle source
# File lib/coin_decimal.rb, line 70
def negative?
  value < 0
end
positive?() click to toggle source
# File lib/coin_decimal.rb, line 66
def positive?
  value > 0
end
to_d() click to toggle source
# File lib/coin_decimal.rb, line 62
def to_d
  formatted.to_d
end
to_s(short: true)
Alias for: formatted

Private Instance Methods

string() click to toggle source
# File lib/coin_decimal.rb, line 76
def string
  result = value.abs.to_s

  result = \
    if result.length > precision
      result.insert(-(precision + 1), ".")
    else
      "0.#{result.rjust(precision, "0")}"
    end

  negative? ? "-#{result}" : result
end