Чтобы получить точный вывод, который вы запрашивали, используйте Number :: FormatEng и Number :: Format :
use strict;
use warnings;
use Number::FormatEng qw(:all);
use Number::Format qw(:subs);
my $string = "54.4M" ;
my $string2 = "3.2G" ;
print format_number(unformat_pref($string)) , "\n";
print format_number(unformat_pref($string2)) , "\n";
__END__
54,400,000
3,200,000,000
Кстати, только unformat_pref
требуется, если вы собираетесь выполнять вычисления с результатом.
Поскольку Number :: FormatEng предназначался для инженерного преобразования нотации (не для байтов), его префикс чувствителен к регистру. Если вы хотите использовать его в килобайтах, вы должны использовать строчные буквы k
.
Number :: Format преобразует эти строки в фактические байты (вроде, почти).
use Number::Format qw(:subs);
my $string = "54.4M" ;
my $string2 = "3.2G" ;
print round(unformat_number($string) , 0), "\n";
print round(unformat_number($string2), 0), "\n";
__END__
57042534
3435973837
Причина, по которой я сказал "почти как", заключается в том, что Number::Format
рассматривает 1K
как равное 1024 байта, а не 1000 байтов. Возможно, поэтому он дает странный результат (с дробными байтами), если только он не округлен.