round_amount: Anzahl Stellen nicht zu hoch werden lassen
authorMoritz Bunkus <m.bunkus@linet-services.de>
Mon, 26 Oct 2015 11:08:10 +0000 (12:08 +0100)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Mon, 26 Oct 2015 11:08:10 +0000 (12:08 +0100)
SL/Form.pm
t/form/round_amount.t

index 35b21d5..c59669c 100644 (file)
@@ -982,7 +982,9 @@ sub round_amount {
   # part. If an overflow occurs then apply that overflow to the part
   # before the decimal sign as well using integer arithmetic again.
 
-  my $amount_str = sprintf '%.*f', $places + 10, abs($amount);
+  my $int_amount = int(abs $amount);
+  my $str_places = max(min(10, 16 - length("$int_amount") - $places), $places);
+  my $amount_str = sprintf '%.*f', $places + $str_places, abs($amount);
 
   return $amount unless $amount_str =~ m{^(\d+)\.(\d+)$};
 
index d9c8edb..18553c0 100644 (file)
@@ -57,6 +57,8 @@ is($::form->round_amount(198.90 * 0.75, 2), '149.18', '198.90 * 0.75 @ 2');
 is($::form->round_amount(198.90 * 0.75, 1), '149.2',  '198.90 * 0.75 @ 1');
 is($::form->round_amount(198.90 * 0.75, 0), '149',    '198.90 * 0.75 @ 0');
 
+is($::form->round_amount(19610.975, 2), '19610.98', '19610.975 @ 2');
+
 # Negative values
 is($::form->round_amount(-1.05, 2), '-1.05', '-1.05 @ 2');
 is($::form->round_amount(-1.05, 1), '-1.1',  '-1.05 @ 1');