From 942267b52abfa5b0c5312831002143987b2dbeb8 Mon Sep 17 00:00:00 2001 From: Federico Aldunate Date: Fri, 28 May 2021 20:40:49 -0300 Subject: [PATCH 1/3] Use BigDecimal compatible operation in NumberToRoundedConverter --- .../number_helper/number_to_rounded_converter.rb | 15 ++++++++++----- activesupport/test/number_helper_test.rb | 1 + 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/activesupport/lib/active_support/number_helper/number_to_rounded_converter.rb b/activesupport/lib/active_support/number_helper/number_to_rounded_converter.rb index 8cf412088d6ac..6bd1e1bb66e2f 100644 --- a/activesupport/lib/active_support/number_helper/number_to_rounded_converter.rb +++ b/activesupport/lib/active_support/number_helper/number_to_rounded_converter.rb @@ -20,14 +20,19 @@ def convert end formatted_string = - if rounded_number.nan? || rounded_number.infinite? || rounded_number == rounded_number.to_i - "%00.#{precision}f" % rounded_number + if rounded_number.nan? + "NaN" + elsif rounded_number.infinite? + "Inf" else s = rounded_number.to_s("F") - s << "0" * precision a, b = s.split(".", 2) - a << "." - a << b[0, precision] + if precision != 0 + b << "0" * precision + a << "." + a << b[0, precision] + end + a end else formatted_string = rounded_number diff --git a/activesupport/test/number_helper_test.rb b/activesupport/test/number_helper_test.rb index 579ba73ede255..ca9a02f536451 100644 --- a/activesupport/test/number_helper_test.rb +++ b/activesupport/test/number_helper_test.rb @@ -207,6 +207,7 @@ def test_to_rounded_with_significant_digits assert_equal "9775.0000000000000000", number_helper.number_to_rounded("9775", precision: 20, significant: true) assert_equal "9775." + "0" * 96, number_helper.number_to_rounded("9775", precision: 100, significant: true) assert_equal("97.7", number_helper.number_to_rounded(Rational(9772, 100), precision: 3, significant: true)) + assert_equal "28729870200000000000000", number_helper.number_to_rounded(0.287298702e23.to_d, precision: 0, significant: true) end end From 5608ba8e668a5571cd25d196ca6e3a73412e2b3f Mon Sep 17 00:00:00 2001 From: Zachary Scott Date: Tue, 1 Jun 2021 16:08:21 +0900 Subject: [PATCH 2/3] NumberToRoundedConverter should handle -Float::INFINITY cc https://github.com/rails/rails/pull/42316#issuecomment-851606043 --- .../number_helper/number_to_rounded_converter.rb | 9 ++++----- activesupport/test/number_helper_test.rb | 1 + 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/activesupport/lib/active_support/number_helper/number_to_rounded_converter.rb b/activesupport/lib/active_support/number_helper/number_to_rounded_converter.rb index 6bd1e1bb66e2f..f48a5158c3362 100644 --- a/activesupport/lib/active_support/number_helper/number_to_rounded_converter.rb +++ b/activesupport/lib/active_support/number_helper/number_to_rounded_converter.rb @@ -20,11 +20,7 @@ def convert end formatted_string = - if rounded_number.nan? - "NaN" - elsif rounded_number.infinite? - "Inf" - else + if rounded_number.finite? s = rounded_number.to_s("F") a, b = s.split(".", 2) if precision != 0 @@ -33,6 +29,9 @@ def convert a << b[0, precision] end a + else + # Infinity/NaN + "%f" % rounded_number end else formatted_string = rounded_number diff --git a/activesupport/test/number_helper_test.rb b/activesupport/test/number_helper_test.rb index ca9a02f536451..9bdec994b74d3 100644 --- a/activesupport/test/number_helper_test.rb +++ b/activesupport/test/number_helper_test.rb @@ -208,6 +208,7 @@ def test_to_rounded_with_significant_digits assert_equal "9775." + "0" * 96, number_helper.number_to_rounded("9775", precision: 100, significant: true) assert_equal("97.7", number_helper.number_to_rounded(Rational(9772, 100), precision: 3, significant: true)) assert_equal "28729870200000000000000", number_helper.number_to_rounded(0.287298702e23.to_d, precision: 0, significant: true) + assert_equal "-Inf", number_helper.number_to_rounded(-Float::INFINITY, precision: 0, significant: true) end end From 17a4a0c5b5d5bd1dc8a1796b097db0c72b0f99b4 Mon Sep 17 00:00:00 2001 From: Andrew White Date: Thu, 3 Jun 2021 15:27:56 +0100 Subject: [PATCH 3/3] Add CHANGELOG entry for #42316 and #42341 --- activesupport/CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/activesupport/CHANGELOG.md b/activesupport/CHANGELOG.md index 5255ee4fbce3f..89893579f7a39 100644 --- a/activesupport/CHANGELOG.md +++ b/activesupport/CHANGELOG.md @@ -1,3 +1,10 @@ +* Fix bug in `number_with_precision` when using large `BigDecimal` values. + + Fixes #42302. + + *Federico Aldunate*, *Zachary Scott* + + ## Rails 6.1.3.2 (May 05, 2021) ## * No changes.