module NumberFormattable extend ActiveSupport::Concern def precision @precision ||= Lookup.number_formats.find { |f| f.name.parameterize.underscore == 'precision'} if @precision.nil? @print_settings ||= PrintSetting.get_precision_delimiter if @print_settings @precision = OpenStruct.new(value: @print_settings.precision.to_i) else @precision = OpenStruct.new(value: 2) end end @precison_value ||= @precision.value.to_i end def delimiter @delimiter ||= Lookup.number_formats.find { |f| f.name.parameterize.underscore == 'delimiter'} if @delimiter.nil? @print_settings ||= PrintSetting.get_precision_delimiter if @print_settings && @print_settings.delimiter @delimiter = OpenStruct.new(value: ",") else @delimiter = OpenStruct.new(value: "") end end @delimiter_value ||= @delimiter.value.to_s.gsub(/\\u(\h{4})/) { |m| [$1].pack("H*").unpack("n*").pack("U*") } end def strip_insignificant_zeros @strip_insignificant_zeros ||= Lookup.number_formats.find { |f| f.name.parameterize.underscore == 'strip_insignificant_zeros'} if @strip_insignificant_zeros.nil? @strip_insignificant_zeros = OpenStruct.new(value: false) end @strip_insignificant_zeros_value ||= ['1', 't', 'true', 'on', 'y', 'yes'].include? @strip_insignificant_zeros.value.to_s end def number_format(number, options = {}) options[:precision] = options[:precision] || precision # options[:delimiter] = options[:delimiter] || delimiter options[:strip_insignificant_zeros] = options[:strip_insignificant_zeros] || strip_insignificant_zeros if options[:precision] > 0 if options[:strip_insignificant_zeros] formatted = "%.12g" % number.round(options[:precision]) else formatted = "%.#{options[:precision]}f" % number.round(options[:precision]) end else formatted = number.round(options[:precision]).to_i.to_s end if options[:delimiter] && !options[:delimiter].empty? formatted = formatted.gsub(/(\d)(?=\d{3}+(\.\d*)?$)/, "\\1#{options[:delimiter]}") end return formatted end end