From: Sven Schöling Date: Mon, 8 Nov 2021 03:17:47 +0000 (+0100) Subject: Helper::Number: _format_number_units X-Git-Tag: kivitendo-mebil_0.1-0~10^2~2^2~216^2~65 X-Git-Url: http://wagnertech.de/git?a=commitdiff_plain;h=0265c7a85c26f727d2703223d1ff3321c99cb08f;p=kivitendo-erp.git Helper::Number: _format_number_units SL::Helper::Number pendant zu SL::Form::format_amount_units --- diff --git a/SL/Helper/Number.pm b/SL/Helper/Number.pm index 0a0ef15fe..bf3b2b2cf 100644 --- a/SL/Helper/Number.pm +++ b/SL/Helper/Number.pm @@ -9,6 +9,7 @@ our @EXPORT_OK = qw( _format_number _round_number _format_total _round_total _parse_number + _format_number_units ); our %EXPORT_TAGS = (ALL => \@EXPORT_OK); @@ -50,6 +51,55 @@ sub _format_number { $amount; } +sub _format_number_units { + my ($amount, $places, $unit_from, $unit_to, %params) = @_; + + my $all_units = $params{all_units} //= SL::DB::Manager::Unit->get_all; + + if (!$unit_from || !$unit_to) { + return _format_number($amount, $places, %params); + } + + $amount *= $unit_from->convert_to(1, $unit_to); + + my $conv_units = $unit_from->convertible_units($all_units); + + if (!scalar @{ $conv_units }) { + return _format_number($amount, $places, %params) . " " . $unit_to->name; + } + + my @values; + my $num; + + for my $unit (@$conv_units) { + my $last = $unit->name eq $unit_to->name; + if (!$last) { + $num = int($amount / $unit->factor); + $amount -= $num * $unit->factor; + } + + if ($last ? $amount : $num) { + push @values, { + unit => $unit->name, + amount => $last ? $amount / $unit->factor : $num, + places => $last ? $places : 0 + }; + } + + last if $last; + } + + if (!@values) { + push @values, { "unit" => $unit_to->name, + "amount" => 0, + "places" => 0 }; + } + + return join " ", map { + _format_number($_->{amount}, $_->{places}, %params), $_->{unit} + } @values; +} + sub _round_number { my ($amount, $places, $adjust) = @_;