Perl에서 숫자를 여러 형식으로 변환하려면 어떻게해야합니까?
문제
쉽고 간단한 방법/서브/모듈을 알고있어서 숫자 (예 : 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로 나눕니다.
이 기능은 오늘날까지 일부 생산 코드에서 사용됩니다.
제휴하지 않습니다 StackOverflow