Frage

Wissen Sie, eine einfache und unkomplizierte Methode / sub / Modul, das mir eine Nummer konvertieren (zB 1.234.567,89) zu einer leicht lesbaren Form - so etwas wie 1.23m

?

Im Moment kann ich dies tun, indem mehrere Vergleiche, aber ich bin nicht zufrieden mit meiner Methode:

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";
}                                                                  

Vielen Dank für Ihre Hilfe!

War es hilfreich?

Lösung

Die Nummer :: Bytes :: Mensch Modul sollte in der Lage sein zu helfen, Sie aus.

Ein Beispiel, wie es zu benutzen, kann in seiner Zusammenfassung zu finden:

  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); # '-'

Andere Tipps

Nummer :: Bytes :: Menschen scheint genau das zu tun was Sie wollen.

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);
}

In der reinen Perl Form, ich habe dies getan, mit einem verschachtelten ternären Operator auf Ausführlichkeit zu schneiden:

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";

Ausgänge:

220.64KB/s

Dieser Code-Schnipsel ist in PHP geschrieben, und es wird auf einigem Beispiel lose basiert jemand anderes irgendwo auf ihrer Website hatte (sorry Kumpel, ich kann mich nicht erinnern).

Das Grundkonzept ist anstelle der Verwendung, wenn eine Schleife verwenden.

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];
}

Die number_format () -Aufruf ist eine PHP-Library-Funktion, die eine Zeichenfolge mit Kommas zwischen den Tausenden Gruppen zurückgibt. Ich bin mir nicht sicher, ob so etwas wie es in Perl existiert.

Die $ dig Parameter legt eine Obergrenze für die Anzahl der Stellen zu zeigen. Wenn $ dig 2 ist, wird es Ihnen 1,2k von 1237 geben.

Um Format Bytes, teilen nur 1024 statt.

Diese Funktion ist bei der Verwendung in einigen Produktionscode zu diesem Tag.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top