class ReadXls::Evaluator::FormatNumber

Constants

SECONDS_IN_DAY

Attributes

extended_format[RW]
number[RW]

Public Class Methods

new(number, extended_format) click to toggle source
# File lib/read_xls/evaluator/format_number.rb, line 8
def initialize(number, extended_format)
  self.number          = BigDecimal.new(number.to_s)
  self.extended_format = extended_format
end

Public Instance Methods

evaluate() click to toggle source
# File lib/read_xls/evaluator/format_number.rb, line 13
def evaluate
  return number unless extended_format

  case extended_format.format_type
    when :date
      days_since_datemode = number.to_i
      inner_day_fraction  = number.frac

      date = build_date(days_since_datemode)

      if inner_day_fraction == 0
        date
      else
        build_time(date, inner_day_fraction)
      end
    else
      number
  end
end

Private Instance Methods

build_date(days_since_datemode) click to toggle source
# File lib/read_xls/evaluator/format_number.rb, line 36
def build_date(days_since_datemode)
  Date.new(1899, 12, 30) + days_since_datemode
end
build_time(date, inner_day_fraction) click to toggle source
# File lib/read_xls/evaluator/format_number.rb, line 41
def build_time(date, inner_day_fraction)
  time = Time.parse("#{date.year}-#{date.month}-#{date.day}T00:00:00Z")
  time + (inner_day_fraction * SECONDS_IN_DAY).round(0)
end