Sha256: f2f3c5efc6c512eb1e8ac4212fb890ff698bf3be58b03caeb2a3f283876cf714

Contents?: true

Size: 1.17 KB

Versions: 3

Compression:

Stored size: 1.17 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

3 entries across 3 versions & 1 rubygems

Version Path
thinreports-0.9.1 lib/thinreports/core/shape/text_block/formatter/number.rb
thinreports-0.9.0 lib/thinreports/core/shape/text_block/formatter/number.rb
thinreports-0.8.2 lib/thinreports/core/shape/text_block/formatter/number.rb