From dcbdd004fc3b28ec976ffa946954f1700e3a553d Mon Sep 17 00:00:00 2001 From: Michael Koziarski Date: Wed, 26 Mar 2008 02:43:38 +0000 Subject: Standardise the implementation of the extensions to BigDecimal. Closes #10608 [mikong] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@9091 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- .../lib/active_support/core_ext/bigdecimal.rb | 4 ++ .../core_ext/bigdecimal/conversions.rb | 58 +++++++++++++--------- 2 files changed, 39 insertions(+), 23 deletions(-) diff --git a/activesupport/lib/active_support/core_ext/bigdecimal.rb b/activesupport/lib/active_support/core_ext/bigdecimal.rb index b442ae9655..d429078c91 100644 --- a/activesupport/lib/active_support/core_ext/bigdecimal.rb +++ b/activesupport/lib/active_support/core_ext/bigdecimal.rb @@ -1,2 +1,6 @@ require 'bigdecimal' require 'active_support/core_ext/bigdecimal/conversions' + +class BigDecimal#:nodoc: + include ActiveSupport::CoreExtensions::BigDecimal::Conversions +end diff --git a/activesupport/lib/active_support/core_ext/bigdecimal/conversions.rb b/activesupport/lib/active_support/core_ext/bigdecimal/conversions.rb index d2504302cd..d2b01b1b8d 100644 --- a/activesupport/lib/active_support/core_ext/bigdecimal/conversions.rb +++ b/activesupport/lib/active_support/core_ext/bigdecimal/conversions.rb @@ -1,29 +1,41 @@ require 'yaml' -class BigDecimal #:nodoc: - alias :_original_to_s :to_s - def to_s(format="F") - _original_to_s(format) - end - - yaml_as "tag:yaml.org,2002:float" - def to_yaml( opts = {} ) - YAML::quick_emit( nil, opts ) do |out| - # This emits the number without any scientific notation. - # I prefer it to using self.to_f.to_s, which would lose precision. - # - # Note that YAML allows that when reconsituting floats - # to native types, some precision may get lost. - # There is no full precision real YAML tag that I am aware of. - str = self.to_s - if str == "Infinity" - str = ".Inf" - elsif str == "-Infinity" - str = "-.Inf" - elsif str == "NaN" - str = ".NaN" +module ActiveSupport #:nodoc: + module CoreExtensions #:nodoc: + module BigDecimal #:nodoc: + module Conversions + def self.included(base) #:nodoc: + base.instance_eval do + alias_method :_original_to_s, :to_s + alias_method :to_s, :to_formatted_s + end + end + + def to_formatted_s(format="F") + _original_to_s(format) + end + + yaml_as "tag:yaml.org,2002:float" + def to_yaml( opts = {} ) + YAML::quick_emit( nil, opts ) do |out| + # This emits the number without any scientific notation. + # I prefer it to using self.to_f.to_s, which would lose precision. + # + # Note that YAML allows that when reconsituting floats + # to native types, some precision may get lost. + # There is no full precision real YAML tag that I am aware of. + str = self.to_s + if str == "Infinity" + str = ".Inf" + elsif str == "-Infinity" + str = "-.Inf" + elsif str == "NaN" + str = ".NaN" + end + out.scalar( "tag:yaml.org,2002:float", str, :plain ) + end + end end - out.scalar( "tag:yaml.org,2002:float", str, :plain ) end end end -- cgit v1.2.3