diff --git a/actionpack/lib/action_view/helpers/number_helper.rb b/actionpack/lib/action_view/helpers/number_helper.rb index 98df5c169b7e..d1c8064c1bf2 100644 --- a/actionpack/lib/action_view/helpers/number_helper.rb +++ b/actionpack/lib/action_view/helpers/number_helper.rb @@ -260,7 +260,7 @@ def number_with_precision(number, options = {}) if number == 0 digits, rounded_number = 1, 0 else - digits = (Math.log10(number) + 1).floor + digits = (Math.log10(number.abs) + 1).floor rounded_number = BigDecimal.new((number / 10 ** (digits - precision)).to_s).round.to_f * 10 ** (digits - precision) end precision = precision - digits @@ -459,7 +459,7 @@ def number_to_human(number, options = {}) raise ArgumentError, ":units must be a Hash or String translation scope." end.keys.map{|e_name| DECIMAL_UNITS.invert[e_name] }.sort_by{|e| -e} - number_exponent = number != 0 ? Math.log10(number).floor : 0 + number_exponent = number != 0 ? Math.log10(number.abs).floor : 0 display_exponent = unit_exponents.find{|e| number_exponent >= e } number /= 10 ** display_exponent diff --git a/actionpack/test/template/number_helper_test.rb b/actionpack/test/template/number_helper_test.rb index 31461e183388..c14dfb250fe8 100644 --- a/actionpack/test/template/number_helper_test.rb +++ b/actionpack/test/template/number_helper_test.rb @@ -83,6 +83,7 @@ def test_number_with_delimiter_with_options_hash end def test_number_with_precision + assert_equal("-111.235", number_with_precision(-111.2346)) assert_equal("111.235", number_with_precision(111.2346)) assert_equal("31.83", number_with_precision(31.825, :precision => 2)) assert_equal("111.23", number_with_precision(111.2346, :precision => 2)) @@ -184,6 +185,7 @@ def test_number_to_human_size_with_custom_delimiter_and_separator end def test_number_to_human + assert_equal '-123', number_to_human(-123) assert_equal '0', number_to_human(0) assert_equal '123', number_to_human(123) assert_equal '1.23 Thousand', number_to_human(1234)