[英]How can I convert a number to its multiple form in Perl?
您是否知道一個簡單而直接的方法/子/模塊,該方法/子/模塊可讓我將數字(例如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
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);
}
該代碼段是用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。
到目前為止,此功能已在某些生產代碼中使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.