Question

Connaissez-vous une méthode / sous / module simple et facile à utiliser qui me permet de convertir un nombre (par exemple, 1234567.89) en un formulaire facilement lisible - de l’ordre de 1,23M?

Pour le moment, je peux le faire en faisant plusieurs comparaisons, mais ma méthode ne me convient pas:

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

Merci pour votre aide!

Était-ce utile?

La solution

Le module Number :: Bytes :: Human devrait pouvoir vous aider. vous sortir.

Un exemple d'utilisation est disponible dans son synopsis:

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

Autres conseils

Number :: Bytes :: Human semble faire exactement cela ce que tu veux.

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

Sous forme pure en Perl, je l’ai fait avec un opérateur ternaire imbriqué pour couper le mot:

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

Sorties:

220.64KB/s

Cet extrait de code est en PHP, et il est vaguement basé sur un exemple que quelqu'un d'autre a eu sur son site Web quelque part (désolé mon ami, je ne m'en souviens pas).

Le concept de base est d'utiliser une boucle au lieu d'utiliser 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];
}

L’appel number_format () est une fonction de la bibliothèque PHP qui renvoie une chaîne avec des virgules entre les groupes de milliers. Je ne suis pas sûr que quelque chose comme cela existe en Perl.

Le paramètre $ dig définit une limite quant au nombre de chiffres à afficher. Si $ dig vaut 2, cela vous donnera 1.2k sur 1237.

Pour formater les octets, il suffit de diviser par 1024 à la place.

Cette fonction est utilisée dans certains codes de production à ce jour.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top