diff --git a/activesupport/lib/active_support/number_helper/number_converter.rb b/activesupport/lib/active_support/number_helper/number_converter.rb index 22b4a936d1d47..fdcced24d9fbb 100644 --- a/activesupport/lib/active_support/number_helper/number_converter.rb +++ b/activesupport/lib/active_support/number_helper/number_converter.rb @@ -179,8 +179,10 @@ def valid_bigdecimal case number when Float, Rational number.to_d(0) - else + when String BigDecimal(number, exception: false) + else + number.to_d rescue nil end end end diff --git a/activesupport/test/number_helper_test.rb b/activesupport/test/number_helper_test.rb index 37272ee19d7ce..a1633ba87b204 100644 --- a/activesupport/test/number_helper_test.rb +++ b/activesupport/test/number_helper_test.rb @@ -15,6 +15,16 @@ class TestClassWithClassNumberHelpers extend ActiveSupport::NumberHelper end + class NumberWithToD + def initialize(number) + @number = number + end + + def to_d + @number.to_d + end + end + def setup @instance_with_helpers = TestClassWithInstanceNumberHelpers.new end @@ -95,6 +105,7 @@ def test_number_to_currency assert_equal("-$,11", number_helper.number_to_currency("-,11")) assert_equal("$0.00", number_helper.number_to_currency(-0.0)) assert_equal("$0.00", number_helper.number_to_currency("-0.0")) + assert_equal("$1.23", number_helper.number_to_currency(NumberWithToD.new(1.23))) end end