Sha256: 32db1b1f43b9dc817bbaa7227c1a9bbd53635e27d9f6886e5c9b291a52c2aec9

Contents?: true

Size: 1.15 KB

Versions: 2

Compression:

Stored size: 1.15 KB

Contents

# coding: utf-8

require 'bigdecimal'

module Thinreports
  module Core::Shape::TextBlock

    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 blank_value?(precision)
            val = number_with_precision(val, precision)
          end
          unless blank_value?(delimiter)
            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

2 entries across 2 versions & 1 rubygems

Version Path
thinreports-0.8.1 lib/thinreports/core/shape/text_block/formatter/number.rb
thinreports-0.8.0 lib/thinreports/core/shape/text_block/formatter/number.rb