Sha256: 86bd830a3e8d58533eb582b95c05b564f71eba41b1da165582fb103d0b5e6140

Contents?: true

Size: 1.19 KB

Versions: 1

Compression:

Stored size: 1.19 KB

Contents

# coding: utf-8

require 'bigdecimal'

module ThinReports
  module Core::Shape::Tblock
    
    # @private
    class Formatter::Number < Formatter::Basic
      
    private
      
      def apply_format_to(value)
        precision = format.format_number_precision
        delimiter = format.format_number_delimiter
        
        if_applicable value do |val|
          unless precision.blank?
            val = number_with_precision(val, precision)
          end
          unless delimiter.blank?
            val = number_with_delimiter(val, delimiter)
          end
          val
        end
      end

      def if_applicable(value, &block)
        val = case value
          when Numeric then value
          when String
            (Integer(value) rescue nil) || (Float(value) rescue nil)
          else nil
        end
        val.nil? ? value : block.call(val)
      end
      
      def number_with_delimiter(value, delimiter = ',')
        value.to_s.gsub(/(\d)(?=(\d{3})+(?!\d))/){ "#{$1}#{delimiter}" }
      end
      
      def number_with_precision(value, precision = 3)
        value = BigDecimal(value.to_s).round(precision)
        sprintf("%.#{precision}f", value)
      end
    end
    
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
thinreports-0.6.0.pre3 lib/thinreports/core/shape/tblock/formatter/number.rb