Module: ActiveSupport::CoreExtensions::BigDecimal::Conversions

Included in:
BigDecimal
Defined in:
lib/active_support/core_ext/bigdecimal/conversions.rb

Constant Summary collapse

DEFAULT_STRING_FORMAT =
'F'.freeze
YAML_TAG =
'tag:yaml.org,2002:float'.freeze
YAML_MAPPING =
{ 'Infinity' => '.Inf', '-Infinity' => '-.Inf', 'NaN' => '.NaN' }

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object

:nodoc:


11
12
13
14
15
16
17
18
# File 'lib/active_support/core_ext/bigdecimal/conversions.rb', line 11

def self.included(base) #:nodoc:
  base.class_eval do
    alias_method :_original_to_s, :to_s
    alias_method :to_s, :to_formatted_s

    yaml_as YAML_TAG
  end
end

Instance Method Details

#to_formatted_s(format = DEFAULT_STRING_FORMAT) ⇒ Object


20
21
22
# File 'lib/active_support/core_ext/bigdecimal/conversions.rb', line 20

def to_formatted_s(format = DEFAULT_STRING_FORMAT)
  _original_to_s(format)
end

#to_yaml(opts = {}) ⇒ Object

This emits the number without any scientific notation. This is better than self.to_f.to_s since it doesn't lose precision.

Note that reconstituting YAML floats to native floats may lose precision.


28
29
30
31
32
33
# File 'lib/active_support/core_ext/bigdecimal/conversions.rb', line 28

def to_yaml(opts = {})
  YAML.quick_emit(nil, opts) do |out|
    string = to_s
    out.scalar(YAML_TAG, YAML_MAPPING[string] || string, :plain)
  end
end