From 81175fb98a089d3b0b70a8ff8bf82a70556a3ff0 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Wed, 25 Aug 2021 08:16:27 -0400 Subject: [PATCH] Fix number_to_currency regression in handling "-0.0" simplifying the method along the way. This regressed in #42581 and is related to prior work in #39350 and #37865. --- .../number_to_currency_converter.rb | 22 +++++++++---------- activesupport/test/number_helper_test.rb | 2 ++ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/activesupport/lib/active_support/number_helper/number_to_currency_converter.rb b/activesupport/lib/active_support/number_helper/number_to_currency_converter.rb index 4d0f9bd437..241ec903be 100644 --- a/activesupport/lib/active_support/number_helper/number_to_currency_converter.rb +++ b/activesupport/lib/active_support/number_helper/number_to_currency_converter.rb @@ -8,23 +8,21 @@ module ActiveSupport self.namespace = :currency def convert - number = self.number.to_s.strip format = options[:format] - if number.sub!(/^-/, "") - number_f = number.to_f.abs - if number_f == 0.0 - # likely an alternate input format that failed to parse. - # see https://github.com/rails/rails/pull/39350 - format = options[:negative_format] - else - number_f *= 10**options[:precision] - format = options[:negative_format] if number_f >= 0.5 + number_f = valid_float? + if number_f + if number_f.negative? + number_f = number_f.abs + format = options[:negative_format] if (number_f * 10**options[:precision]) >= 0.5 end + number_s = NumberToRoundedConverter.convert(number_f, options) + else + number_s = number.to_s.strip + format = options[:negative_format] if number_s.sub!(/^-/, "") end - rounded_number = NumberToRoundedConverter.convert(number, options) - format.gsub("%n", rounded_number).gsub("%u", options[:unit]) + format.gsub("%n", number_s).gsub("%u", options[:unit]) end private diff --git a/activesupport/test/number_helper_test.rb b/activesupport/test/number_helper_test.rb index dcda16eb98..acb6f991c6 100644 --- a/activesupport/test/number_helper_test.rb +++ b/activesupport/test/number_helper_test.rb @@ -88,6 +88,8 @@ module ActiveSupport assert_equal("-$1,11", number_helper.number_to_currency("-1,11")) assert_equal("-$0,11", number_helper.number_to_currency("-0,11")) 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")) end end