From 94a445d4138eaa0aaa89c49053b6ced8ca1ee0d1 Mon Sep 17 00:00:00 2001 From: Nick Clemens Date: Tue, 18 Aug 2020 16:41:09 +0000 Subject: [PATCH] Bug 26239: Do not format large negative numbers At several places we got the following error if we use numbers too big for Number::Format Template process failed: undef error - round() overflow. Try smaller precision or use Math::BigFloat at /home/koha/src/Koha/Number/Price.pm line 44 It make the app explodes. The goal here is to handle these errors gracefully and easily. We fixed it for positive numbers in bug 15770, but we neglected the case of negative numbers Test plan: - Add a manual credit to a patron of 100000000000000 - ISE! - Apply patch - Restart all the things Works perfectly. Signed-off-by: Amit Gupta Signed-off-by: Katrin Fischer Signed-off-by: Jonathan Druart --- Koha/Number/Price.pm | 3 +-- t/Number/Price.t | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Koha/Number/Price.pm b/Koha/Number/Price.pm index 7b0b826a14..e9a6aa748e 100644 --- a/Koha/Number/Price.pm +++ b/Koha/Number/Price.pm @@ -40,11 +40,10 @@ sub format { return unless defined $self->value; my $format_params = $self->_format_params( $params ); - # To avoid the system to crash, we will not format big number # We divide per 100 because we want to keep the default DECIMAL_DIGITS (2) # error - round() overflow. Try smaller precision or use Math::BigFloat - return $self->value if $self->value > Number::Format::MAX_INT/100; + return $self->value if abs($self->value) > Number::Format::MAX_INT/100; return Number::Format->new(%$format_params)->format_price($self->value); } diff --git a/t/Number/Price.t b/t/Number/Price.t index 141f00ffa2..ce607a83a1 100644 --- a/t/Number/Price.t +++ b/t/Number/Price.t @@ -1,6 +1,6 @@ use Modern::Perl; -use Test::More tests => 34; +use Test::More tests => 35; use Test::MockModule; use t::lib::Mocks; @@ -37,6 +37,7 @@ is( Koha::Number::Price->new(1234567890)->format( $format ), '1,234,567,890.00', 'US: format 1234567890' ); is( Koha::Number::Price->new(100000000000000)->format, '100000000000000', 'Numbers too big are not formatted'); +is( Koha::Number::Price->new(-100000000000000)->format, '-100000000000000', 'Negative numbers too big are not formatted'); is( Koha::Number::Price->new->format( { %$format, with_symbol => 1 } ), '$0.00', 'US: format 0 with symbol' ); -- 2.39.5