module Incline::Extensions::DecimalValue

Public Class Methods

included(base) click to toggle source
# File lib/incline/extensions/decimal_value.rb, line 8
def self.included(base)
  base.class_eval do
    private

    undef cast_value

    def cast_value(value)
      begin
        casted_value =
            case value
              when ::Float
                convert_float_to_big_decimal(value)
              when ::String
                # 1,234.56789e0
                if value =~ Incline::NumberFormats::WITH_DELIMITERS
                  value = value.gsub(',', '')
                end
                if value =~ Incline::NumberFormats::WITHOUT_DELIMITERS
                  BigDecimal(value, precision.to_i)
                else
                  nil
                end
              when ::Numeric
                BigDecimal(value, precision.to_i)
              else
                if value.respond_to?(:to_d)
                  value.to_d
                else
                  cast_value(value.to_s)
                end
            end

        apply_scale(casted_value) if casted_value
      rescue
        Incline::Log::warn "Failed to parse #{value.inspect}: #{$!.message}"
        nil
      end
    end


  end
end

Public Instance Methods

cast_value(value) click to toggle source
# File lib/incline/extensions/decimal_value.rb, line 14
def cast_value(value)
  begin
    casted_value =
        case value
          when ::Float
            convert_float_to_big_decimal(value)
          when ::String
            # 1,234.56789e0
            if value =~ Incline::NumberFormats::WITH_DELIMITERS
              value = value.gsub(',', '')
            end
            if value =~ Incline::NumberFormats::WITHOUT_DELIMITERS
              BigDecimal(value, precision.to_i)
            else
              nil
            end
          when ::Numeric
            BigDecimal(value, precision.to_i)
          else
            if value.respond_to?(:to_d)
              value.to_d
            else
              cast_value(value.to_s)
            end
        end

    apply_scale(casted_value) if casted_value
  rescue
    Incline::Log::warn "Failed to parse #{value.inspect}: #{$!.message}"
    nil
  end
end