7

数値(たとえば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";
}                                                                  

ご協力ありがとうございました!

4

5 に答える 5

20

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); # '-'
于 2008-09-30T13:18:04.770 に答える
3

Number :: Bytes::Humanはあなたが望むことを正確に実行しているようです。

于 2008-09-30T13:18:52.757 に答える
2

純粋な 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/秒
于 2008-09-30T13:27:32.703 に答える
2
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);
}
于 2008-09-30T14:23:46.750 に答える
0

このスニペットはPHPで作成されており、他の誰かがWebサイトのどこかにある例に大まかに基づいています(申し訳ありませんが、思い出せません)。

基本的な概念は、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で除算します。

この関数は、今日まで一部の製品コードで使用されています。

于 2008-09-30T13:30:36.660 に答える