123456789_123456789_123456789_123456789_123456789_

Class: ActiveSupport::NumberHelper::NumberConverter

Do not use. This class is for internal use only.

Constant Summary

  • DEFAULTS =
    # File 'activesupport/lib/active_support/number_helper/number_converter.rb', line 21
    {
      # Used in number_to_delimited
      # These are also the defaults for 'currency', 'percentage', 'precision', and 'human'
      format: {
        # Sets the separator between the units, for more precision (e.g. 1.0 / 2.0 == 0.5)
        separator: ".",
        # Delimits thousands (e.g. 1,000,000 is a million) (always in groups of three)
        delimiter: ",",
        # Number of decimals, behind the separator (the number 1 with a precision of 2 gives: 1.00)
        precision: 3,
        # If set to true, precision will mean the number of significant digits instead
        # of the number of decimal digits (1234 with precision 2 becomes 1200, 1.23543 becomes 1.2)
        significant: false,
        # If set, the zeros after the decimal separator will always be stripped (e.g.: 1.200 will be 1.2)
        strip_insignificant_zeros: false
      },
    
      # Used in number_to_currency
      currency: {
        format: {
          format: "%u%n",
          negative_format: "-%u%n",
          unit: "$",
          # These five are to override number.format and are optional
          separator: ".",
          delimiter: ",",
          precision: 2,
          significant: false,
          strip_insignificant_zeros: false
        }
      },
    
      # Used in number_to_percentage
      percentage: {
        format: {
          delimiter: "",
          format: "%n%"
        }
      },
    
      # Used in number_to_rounded
      precision: {
        format: {
          delimiter: ""
        }
      },
    
      # Used in number_to_human_size and number_to_human
      human: {
        format: {
          # These five are to override number.format and are optional
          delimiter: "",
          precision: 3,
          significant: true,
          strip_insignificant_zeros: true
        },
        # Used in number_to_human_size
        storage_units: {
          # Storage units output formatting.
          # %u is the storage unit, %n is the number (default: 2 MB)
          format: "%n %u",
          units: {
            byte: "Bytes",
            kb: "KB",
            mb: "MB",
            gb: "GB",
            tb: "TB"
          }
        },
        # Used in number_to_human
        decimal_units: {
          format: "%n %u",
          # Decimal units output formatting
          # By default we will only quantify some of the exponents
          # but the commented ones might be defined or overridden
          # by the user.
          units: {
            # femto: Quadrillionth
            # pico: Trillionth
            # nano: Billionth
            # micro: Millionth
            # mili: Thousandth
            # centi: Hundredth
            # deci: Tenth
            unit: "",
            # ten:
            #   one: Ten
            #   other: Tens
            # hundred: Hundred
            thousand: "Thousand",
            million: "Million",
            billion: "Billion",
            trillion: "Trillion",
            quadrillion: "Quadrillion"
          }
        }
      }
    }

Class Attribute Summary

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(number, options) ⇒ NumberConverter

[ GitHub ]

  
# File 'activesupport/lib/active_support/number_helper/number_converter.rb', line 124

def initialize(number, options)
  @number = number
  @opts = options.symbolize_keys
  @options = nil
end

Class Attribute Details

.namespace (rw)

[ GitHub ]

  
# File 'activesupport/lib/active_support/number_helper/number_converter.rb', line 14

class_attribute :namespace

.namespace?Boolean (rw)

[ GitHub ]

  
# File 'activesupport/lib/active_support/number_helper/number_converter.rb', line 14

class_attribute :namespace

.validate_float (rw)

[ GitHub ]

  
# File 'activesupport/lib/active_support/number_helper/number_converter.rb', line 17

class_attribute :validate_float

.validate_float?Boolean (rw)

[ GitHub ]

  
# File 'activesupport/lib/active_support/number_helper/number_converter.rb', line 17

class_attribute :validate_float

Class Method Details

.convert(number, options)

[ GitHub ]

  
# File 'activesupport/lib/active_support/number_helper/number_converter.rb', line 120

def self.convert(number, options)
  new(number, options).execute
end

Instance Attribute Details

#namespace (rw)

[ GitHub ]

  
# File 'activesupport/lib/active_support/number_helper/number_converter.rb', line 14

class_attribute :namespace

#namespace?Boolean (rw)

[ GitHub ]

  
# File 'activesupport/lib/active_support/number_helper/number_converter.rb', line 14

class_attribute :namespace

#number (readonly)

[ GitHub ]

  
# File 'activesupport/lib/active_support/number_helper/number_converter.rb', line 19

attr_reader :number, :opts

#opts (readonly)

[ GitHub ]

  
# File 'activesupport/lib/active_support/number_helper/number_converter.rb', line 19

attr_reader :number, :opts

#validate_float (rw)

[ GitHub ]

  
# File 'activesupport/lib/active_support/number_helper/number_converter.rb', line 17

class_attribute :validate_float

#validate_float?Boolean (rw)

[ GitHub ]

  
# File 'activesupport/lib/active_support/number_helper/number_converter.rb', line 17

class_attribute :validate_float

Instance Method Details

#default_format_options (private)

[ GitHub ]

  
# File 'activesupport/lib/active_support/number_helper/number_converter.rb', line 149

def default_format_options
  options = DEFAULTS[:format].dup
  options.merge!(DEFAULTS[namespace][:format]) if namespace
  options
end

#default_value(key) (private)

[ GitHub ]

  
# File 'activesupport/lib/active_support/number_helper/number_converter.rb', line 174

def default_value(key)
  key.split(".").reduce(DEFAULTS) { |defaults, k| defaults[k.to_sym] }
end

#execute

[ GitHub ]

  
# File 'activesupport/lib/active_support/number_helper/number_converter.rb', line 130

def execute
  if !number
    nil
  elsif validate_float? && !valid_bigdecimal
    number
  else
    convert
  end
end

#format_options (private)

[ GitHub ]

  
# File 'activesupport/lib/active_support/number_helper/number_converter.rb', line 145

def format_options
  default_format_options.merge!(i18n_format_options)
end

#i18n_format_options (private)

[ GitHub ]

  
# File 'activesupport/lib/active_support/number_helper/number_converter.rb', line 155

def i18n_format_options
  locale = opts[:locale]
  options = I18n.translate(:'number.format', locale: locale, default: {}).dup

  if namespace
    options.merge!(I18n.translate(:"number.#{namespace}.format", locale: locale, default: {}))
  end

  options
end

#options (private)

[ GitHub ]

  
# File 'activesupport/lib/active_support/number_helper/number_converter.rb', line 141

def options
  @options ||= format_options.merge(opts)
end

#translate_in_locale(key, **i18n_options) (private)

[ GitHub ]

  
# File 'activesupport/lib/active_support/number_helper/number_converter.rb', line 170

def translate_in_locale(key, **i18n_options)
  translate_number_value_with_default(key, **{ locale: options[:locale] }.merge(i18n_options))
end

#translate_number_value_with_default(key, **i18n_options) (private)

[ GitHub ]

  
# File 'activesupport/lib/active_support/number_helper/number_converter.rb', line 166

def translate_number_value_with_default(key, **i18n_options)
  I18n.translate(key, **{ default: default_value(key), scope: :number }.merge!(i18n_options))
end

#valid_bigdecimal (private)

[ GitHub ]

  
# File 'activesupport/lib/active_support/number_helper/number_converter.rb', line 178

def valid_bigdecimal
  case number
  when Float, Rational
    number.to_d(0)
  when String
    BigDecimal(number, exception: false)
  else
    number.to_d rescue nil
  end
end