如何在Perl中将数字转换为其多种形式?
时间:2020-03-06 14:55:16 来源:igfitidea点击:
我们是否知道一个简单而直接的方法/子/模块,该方法/子/模块可让我将数字(例如1234567.89)转换为易于阅读的形式,例如1.23M?
现在,我可以通过进行几次比较来做到这一点,但是我对我的方法不满意:
if($bytes > 1000000000){ $bytes = ( sprintf( "%0.2f", $bytes/1000000000 )). " Gb/s"; } elsif ($bytes > 1000000){ $bytes = ( sprintf( "%0.2f", $bytes/1000000 )). " Mb/s"; } elsif ($bytes > 1000){ $bytes = ( sprintf( "%0.2f", $bytes/1000 )). " Kb/s"; } else{ $bytes = sprintf( "%0.2f", $bytes ). "b/s"; }
谢谢帮助!
解决方案
Number :: Bytes :: Human模块应该可以为我们提供帮助。
在其简介中可以找到如何使用它的示例:
use Number::Bytes::Human qw(format_bytes); $size = format_bytes(0); # '0' $size = format_bytes(2*1024); # '2.0K' $size = format_bytes(1_234_890, bs => 1000); # '1.3M' $size = format_bytes(1E9, bs => 1000); # '1.0G' # the OO way $human = Number::Bytes::Human->new(bs => 1000, si => 1); $size = $human->format(1E7); # '10MB' $human->set_options(zero => '-'); $size = $human->format(0); # '-'
Number :: Bytes :: Human似乎完全可以执行我们想要的操作。
在纯Perl形式中,我使用嵌套的三元运算符来完成此操作以减少冗长程度:
sub BytesToReadableString($) { my $c = shift; $c >= 1073741824 ? sprintf("%0.2fGB", $c/1073741824) : $c >= 1048576 ? sprintf("%0.2fMB", $c/1048576) : $c >= 1024 ? sprintf("%0.2fKB", $c/1024) : $c . "bytes"; } print BytesToReadableString(225939) . "/s\n";
输出:
220.64KB/s
该代码段是用PHP编写的,它大致基于其他人在其网站上某个地方的某个示例(对不起,伙计,我不记得了)。
基本概念是使用循环而不是使用if。
function formatNumberThousands($a,$dig) { $unim = array("","k","m","g"); $c = 0; while ($a>=1000 && $c<=3) { $c++; $a = $a/1000; } $d = $dig-ceil(log10($a)); return number_format($a,($c ? $d : 0))."".$unim[$c]; }
调用number_format()是一个PHP库函数,该函数返回在数千个组之间带有逗号的字符串。我不确定在perl中是否存在类似的东西。
$ dig参数设置要显示的位数的限制。如果$ dig是2,它将从1237得到1.2k。
要格式化字节,只需除以1024.
迄今为止,此功能已在某些生产代码中使用。
sub magnitudeformat { my $val = shift; my $expstr; my $exp = log($val) / log(10); if ($exp < 3) { return $val; } elsif ($exp < 6) { $exp = 3; $expstr = "K"; } elsif ($exp < 9) { $exp = 6; $expstr = "M"; } elsif ($exp < 12) { $exp = 9; $expstr = "G"; } # Or "B". else { $exp = 12; $expstr = "T"; } return sprintf("%0.1f%s", $val/(10**$exp), $expstr); }