61 lines
2.1 KiB
Ruby
61 lines
2.1 KiB
Ruby
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
|