Class: SitemapGenerator::BigDecimal
- Inherits:
-
Object
- Object
- SitemapGenerator::BigDecimal
- Defined in:
- lib/sitemap_generator/core_ext/big_decimal.rb
Overview
Scoped BigDecimal wrapper that serializes to YAML without scientific notation. Defined here rather than reopening the global BigDecimal class.
Constant Summary collapse
- YAML_TAG =
'tag:yaml.org,2002:float'- YAML_MAPPING =
{ 'Infinity' => '.Inf', '-Infinity' => '-.Inf', 'NaN' => '.NaN' }.freeze
- DEFAULT_STRING_FORMAT =
'F'
Instance Method Summary collapse
- #*(other) ⇒ Object
- #/(other) ⇒ Object
- #encode_with(coder) ⇒ Object
-
#initialize(num) ⇒ BigDecimal
constructor
A new instance of BigDecimal.
- #to_d ⇒ Object
- #to_s(format = DEFAULT_STRING_FORMAT) ⇒ Object
-
#to_yaml(opts = {}) ⇒ Object
This emits the number without any scientific notation.
Constructor Details
#initialize(num) ⇒ BigDecimal
Returns a new instance of BigDecimal.
23 24 25 |
# File 'lib/sitemap_generator/core_ext/big_decimal.rb', line 23 def initialize(num) @value = BigDecimal(num) end |
Instance Method Details
#*(other) ⇒ Object
27 28 29 |
# File 'lib/sitemap_generator/core_ext/big_decimal.rb', line 27 def *(other) other * @value end |
#/(other) ⇒ Object
31 32 33 |
# File 'lib/sitemap_generator/core_ext/big_decimal.rb', line 31 def /(other) other.is_a?(SitemapGenerator::BigDecimal) ? @value / other.instance_variable_get(:@value) : @value / other end |
#encode_with(coder) ⇒ Object
48 49 50 51 |
# File 'lib/sitemap_generator/core_ext/big_decimal.rb', line 48 def encode_with(coder) string = to_s coder.represent_scalar(nil, YAML_MAPPING[string] || string) end |
#to_d ⇒ Object
53 54 55 |
# File 'lib/sitemap_generator/core_ext/big_decimal.rb', line 53 def to_d self end |
#to_s(format = DEFAULT_STRING_FORMAT) ⇒ Object
58 59 60 |
# File 'lib/sitemap_generator/core_ext/big_decimal.rb', line 58 def to_s(format = DEFAULT_STRING_FORMAT) @value.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.
39 40 41 42 43 44 45 46 |
# File 'lib/sitemap_generator/core_ext/big_decimal.rb', line 39 def to_yaml(opts = {}) return super unless defined?(YAML::ENGINE) && YAML::ENGINE.syck? YAML.quick_emit(nil, opts) do |out| string = to_s out.scalar(YAML_TAG, YAML_MAPPING[string] || string, :plain) end end |