Pregunta

¿Conoces un método / sub / módulo fácil y directo que me permite convertir un número (por ejemplo, 1234567.89) a una forma fácil de leer, algo así como 1.23M?

Ahora mismo puedo hacer esto haciendo varias comparaciones, pero no estoy contento con mi método:

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

¡Gracias por tu ayuda!

¿Fue útil?

Solución

El módulo Number :: Bytes :: Human debería poder ayudar usted fuera.

Un ejemplo de cómo usarlo se puede encontrar en su sinopsis:

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

Otros consejos

Number :: Bytes :: Human parece hacer exactamente lo que quieras.

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

En forma de Perl puro, he hecho esto con un operador ternario anidado para reducir la verbosidad:

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

Salidas:

220.64KB/s

Este fragmento está en PHP, y se basa libremente en algún ejemplo que alguien más tuvo en su sitio web en algún lugar (lo siento amigo, no lo recuerdo).

El concepto básico es, en lugar de usar if, use un bucle.

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

La llamada number_format () es una función de biblioteca PHP que devuelve una cadena con comas entre los grupos de miles. No estoy seguro de si existe algo parecido en Perl.

El parámetro $ dig establece un límite en el número de dígitos a mostrar. Si $ dig es 2, te dará 1.2k de 1237.

Para formatear bytes, simplemente divide por 1024 en su lugar.

Esta función está en uso en algunos códigos de producción hasta el día de hoy.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top