سؤال

هل تعرف سهلة ومباشرة إلى الأمام طريقة/sub/وحدة الذي يسمح لي بتحويل عدد (أقول 1234567.89) إلى شكل قابل للقراءة بسهولة - شيء مثل 1.23 م ؟

الآن لا يمكن القيام بذلك من خلال إجراء العديد من المقارنات, ولكن أنا لست سعيدة مع بلدي الطريقة:

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

في بيور بيرل شكل, لقد فعلت هذا مع تداخل الثلاثي للمشغل قطع على الإسهاب:

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

هذا مقتطف في بي, و هو مبني على أساس بعض الأمثلة على شخص آخر كان على موقعه على الانترنت في مكان ما (عذرا يا صديقي لا أستطيع تذكر).

المفهوم الأساسي هو بدلا من استخدام إذا استخدم حلقة.

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 الوظيفة التي تقوم بإرجاع سلسلة مع الفواصل بين آلاف المجموعات.لست متأكدا إذا كان هناك شيء مثل ذلك موجود في بيرل.

دولار حفر المعلمة أن تضع حدا على عدد من الأرقام إلى المعرض.إذا $حفر 2, وسوف تعطيك 1.2 k من 1237.

على شكل بايت فقط القسمة على 1024 بدلا من ذلك.

هذه هي وظيفة في بعض رمز الإنتاج إلى هذا اليوم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top