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
This commit is contained in:
Michael Koziarski
2008-03-26 02:43:38 +00:00
parent c10b2255b5
commit dcbdd004fc
2 changed files with 39 additions and 23 deletions

View File

@@ -1,2 +1,6 @@
require 'bigdecimal'
require 'active_support/core_ext/bigdecimal/conversions'
class BigDecimal#:nodoc:
include ActiveSupport::CoreExtensions::BigDecimal::Conversions
end

View File

@@ -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