perl - que - mongodb español
¿Cómo puedo convertir un número a su forma múltiple en Perl? (5)
¿Conoces un método / sub / módulo fácil y directo que me permite convertir un número (digamos 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 satisfecho 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!
Este fragmento está en PHP, y se basa libremente en algún ejemplo que alguien más tenía en su sitio web en alguna parte (lo siento amigo, no recuerdo).
El concepto básico es usar un bucle en lugar de usar 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];
}
La llamada a 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 algo así existe en Perl.
El parámetro $ dig establece un límite en la cantidad de dígitos para mostrar. Si $ dig es 2, le dará 1.2k desde 1237.
Para formatear bytes, solo divida por 1024 en su lugar.
Esta función está en uso en algunos códigos de producción hasta el día de hoy.
Number :: Bytes :: Human parece hacer exactamente lo que quieres.
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);
}
El módulo Number :: Bytes :: Human debería poder ayudarte.
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); # ''-''
En forma pura de Perl, he hecho esto con un operador ternario anidado para cortar 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";
Productos:
220.64KB/s