From 83e4b0b90b2b76c38cbe4bca6da50f40a287c319 Mon Sep 17 00:00:00 2001 From: Brennan Dunn Date: Mon, 20 Oct 2008 15:45:14 -0400 Subject: [PATCH] NaN inputs to ActionView's NumberHelper methods will become 0.0 in order to standardize output. --- .../lib/action_view/helpers/number_helper.rb | 6 +++++- actionpack/test/template/number_helper_test.rb | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletions(-) diff --git a/actionpack/lib/action_view/helpers/number_helper.rb b/actionpack/lib/action_view/helpers/number_helper.rb index 77f19b3..d6c386f 100644 --- a/actionpack/lib/action_view/helpers/number_helper.rb +++ b/actionpack/lib/action_view/helpers/number_helper.rb @@ -162,8 +162,9 @@ module ActionView delimiter ||= (options[:delimiter] || defaults[:delimiter]) separator ||= (options[:separator] || defaults[:separator]) begin + number = 0.0 if number.is_a?(Float) && number.nan? parts = number.to_s.split('.') parts[0].gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{delimiter}") parts.join(separator) @@ -211,6 +212,7 @@ module ActionView delimiter ||= (options[:delimiter] || defaults[:delimiter]) begin + number = 0.0 if number.is_a?(Float) && number.nan? rounded_number = (Float(number) * (10 ** precision)).round.to_f / 10 ** precision number_with_delimiter("%01.#{precision}f" % rounded_number, :separator => separator, @@ -249,6 +251,7 @@ module ActionView # number_to_human_size(1234567, 2) # => 1.18 MB # number_to_human_size(483989, 0) # => 473 KB def number_to_human_size(number, *args) + number = 0.0 if number.is_a?(Float) && number.nan? return number.nil? ? nil : pluralize(number.to_i, "Byte") if number.to_i < 1024 options = args.extract_options! @@ -270,6 +273,7 @@ module ActionView max_exp = STORAGE_UNITS.size - 1 number = Float(number) + exponent = (Math.log(number) / Math.log(1024)).to_i # Convert to base 1024 exponent = max_exp if exponent > max_exp # we need this to avoid overflow for the highest unit number /= 1024 ** exponent diff --git a/actionpack/test/template/number_helper_test.rb b/actionpack/test/template/number_helper_test.rb index 9c9f549..14c4a05 100644 --- a/actionpack/test/template/number_helper_test.rb +++ b/actionpack/test/template/number_helper_test.rb @@ -2,6 +2,8 @@ require 'abstract_unit' class NumberHelperTest < ActionView::TestCase tests ActionView::Helpers::NumberHelper + + NAN = 0.0 / 0.0 def test_number_to_phone assert_equal("800-555-1212", number_to_phone(8005551212)) @@ -26,6 +28,7 @@ class NumberHelperTest < ActionView::TestCase assert_equal("£1234567890,50", number_to_currency(1234567890.50, {:unit => "£", :separator => ",", :delimiter => ""})) assert_equal("$1,234,567,890.50", number_to_currency("1234567890.50")) assert_equal("1,234,567,890.50 Kč", number_to_currency("1234567890.50", {:unit => "Kč", :format => "%n %u"})) + assert_equal("$0.00", number_to_currency(NAN)) #assert_equal("$x.", number_to_currency("x")) # fails due to API consolidation assert_equal("$x", number_to_currency("x")) assert_nil number_to_currency(nil) @@ -39,6 +42,7 @@ class NumberHelperTest < ActionView::TestCase assert_equal("1000.000%", number_to_percentage("1000")) assert_equal("x%", number_to_percentage("x")) assert_equal("1.000,000%", number_to_percentage(1000, :delimiter => '.', :separator => ',')) + assert_equal("0%", number_to_percentage(NAN, {:precision => 0})) assert_nil number_to_percentage(nil) end @@ -52,6 +56,7 @@ class NumberHelperTest < ActionView::TestCase assert_equal("123,456.78901", number_with_delimiter(123456.78901)) assert_equal("123,456,789.78901", number_with_delimiter(123456789.78901)) assert_equal("0.78901", number_with_delimiter(0.78901)) + assert_equal("0.0", number_with_delimiter(NAN)) assert_equal("123,456.78", number_with_delimiter("123456.78")) assert_equal("x", number_with_delimiter("x")) assert_nil number_with_delimiter(nil) @@ -73,6 +78,7 @@ class NumberHelperTest < ActionView::TestCase assert_equal("31.83", number_with_precision("31.825", :precision => 2)) assert_equal("112", number_with_precision(111.50, :precision => 0)) assert_equal("1234567892", number_with_precision(1234567891.50, :precision => 0)) + assert_equal("0.00", number_with_precision(NAN, :precision => 2)) # Return non-numeric params unchanged. assert_equal("x", number_with_precision("x")) @@ -107,6 +113,7 @@ class NumberHelperTest < ActionView::TestCase assert_equal '10 KB', number_to_human_size(10.000.kilobytes, :precision => 4) assert_equal '1 Byte', number_to_human_size(1.1) assert_equal '10 Bytes', number_to_human_size(10) + assert_equal '0 Bytes', number_to_human_size(NAN) #assert_nil number_to_human_size('x') # fails due to API consolidation assert_nil number_to_human_size(nil) end -- 1.5.6.4