Perl에서 숫자를 여러 형식으로 변환하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/152968

  •  02-07-2019
  •  | 
  •  

문제

쉽고 간단한 방법/서브/모듈을 알고있어서 숫자 (예 : 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";
}                                                                  

도와 주셔서 감사합니다!

도움이 되었습니까?

해결책

그만큼 숫자 :: 바이트 :: 인간 모듈이 도움을 줄 수 있어야합니다.

사용 방법의 예는 시놉시스에서 찾을 수 있습니다.

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

다른 팁

숫자 :: 바이트 :: 인간 당신이 원하는 것을 정확하게하는 것 같습니다.

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

순수한 perl 형태로, 나는 구두로 자르기 위해 중첩 된 3 배 연산자와 함께 이것을 수행했습니다.

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/s

이 스 니펫은 PHP에 있으며 다른 사람이 자신의 웹 사이트 어딘가에있는 예제를 기반으로 느슨합니다 (죄송합니다. 친구, 기억이 안 돼요).

기본 개념은 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로 나눕니다.

이 기능은 오늘날까지 일부 생산 코드에서 사용됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top