বাইটগুলি কিলোবাইট, মেগাবাইট, গিগাবাইট থেকে ফর্ম্যাট করুন


184

পরিস্থিতি: বিভিন্ন ফাইলের আকার একটি ডাটাবেসে বাইট হিসাবে সংরক্ষণ করা হয়। এই আকারের তথ্যটি কিলোবাইট, মেগাবাইট এবং গিগাবাইটে ফর্ম্যাট করার সর্বোত্তম উপায় কী? উদাহরণস্বরূপ আমার কাছে একটি এমপি 3 রয়েছে যা উবুন্টু "5.2 এমবি (5445632 বাইট)" হিসাবে প্রদর্শিত হয়। আমি কীভাবে এটি একটি ওয়েব পৃষ্ঠায় "5.2 মেগাবাইট" হিসাবে প্রদর্শন করব এবং কেবি হিসাবে একটি মেগাবাইটের চেয়ে কম ফাইল এবং একটি গিগাবাইট এবং উপরের জিবি হিসাবে ফাইল ফাইল করব?


3
আমি বিশ্বাস করি এটি করা আপনার কোনও ফাংশন তৈরি করা উচিত। কেবল 1024 দ্বারা সংখ্যা ভাগ করুন এবং ফলাফলটি দেখুন। যদি এর বেশি হয় তবে 1024 এর পরে আবার ভাগ করুন।
ইভান নেভোস্ট্রুয়েভ

উত্তর:


319
function formatBytes($bytes, $precision = 2) { 
    $units = array('B', 'KB', 'MB', 'GB', 'TB'); 

    $bytes = max($bytes, 0); 
    $pow = floor(($bytes ? log($bytes) : 0) / log(1024)); 
    $pow = min($pow, count($units) - 1); 

    // Uncomment one of the following alternatives
    // $bytes /= pow(1024, $pow);
    // $bytes /= (1 << (10 * $pow)); 

    return round($bytes, $precision) . ' ' . $units[$pow]; 
} 

(Php.net থেকে নেওয়া , সেখানে আরও অনেক উদাহরণ রয়েছে, তবে আমি এটি সেরাটি পছন্দ করি :-)


8
আপনি যদি ব্যবহার করেন $bytes /= (1 << (10 * $pow))বা পছন্দ করেন তবে আমি এটি আরও ভাল পছন্দ করতে পারি। :
ক্রিস জেস্টার-ইয়ং

5
আপনি সেখানে যান: ডি (ব্যক্তিগতভাবে, আমি বিটওয়ালা গাণিতিক পছন্দ করি না, কারণ আপনি যদি এটি ব্যবহার করেন না তবে এটি বোঝা শক্ত ...)
লিও

3
@ জাস্টিন এর কারণ 9287695/1024/1024 আসলে 8,857 :)
মাহন

30
আসলে, এটা KiB, MiB, GiBএবং TiBথেকে আপনার দ্বারা ভাগ করা হয় 1024। আপনি 1000এটি দ্বারা বিভক্ত যদি ছাড়া i
ডেভিয়েটার

8
Uncomment one of the following alternativesএমন কিছু ছিল যা আমি 5 মিনিটের জন্য লক্ষ্য করিনি ...
অরনিস জুরাগা

211

এটি হ'ল ক্রিস জেসেস্টার-ইয়ংয়ের বাস্তবায়ন, আমি পিএইচপি.এন.টি এবং একটি নির্ভুল যুক্তির সাথে একত্রে সবচেয়ে পরিষ্কার দেখেছি।

function formatBytes($size, $precision = 2)
{
    $base = log($size, 1024);
    $suffixes = array('', 'K', 'M', 'G', 'T');   

    return round(pow(1024, $base - floor($base)), $precision) .' '. $suffixes[floor($base)];
}

echo formatBytes(24962496);
// 23.81M

echo formatBytes(24962496, 0);
// 24M

echo formatBytes(24962496, 4);
// 23.8061M

8
এতে 2 টি ত্রুটি রয়েছে - 1 টি (অন্তত ছোট) ফাইলের আকার যুক্ত করুন - 0 (এনএএন রিটার্ন) এর সাথে কাজ করছেন না
maazza

সুন্দর. চারপাশে এর অন্য কোনও সংস্করণ আছে কি?
লুক

3
লিল স্বপ্ন দেখছে : $suffixes = array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'); আমি ইয়োটাবাইট হার্ড ড্রাইভ চাই! :
পি

1
এটির কাজ পেতে আমাকে ডাবল আকারে কাস্ট করতে হয়েছিল। হেরেস আমার জন্য যা কাজ করেছে: ফাংশন ফর্ম্যাটবাইট ($ আকার, $ নির্ভুলতা = 2) $ = বেস = লগ (ভাসমান ($ আকার)) / লগ (1024); $ প্রত্যয় = অ্যারে ('', 'কে', 'এম', 'জি', 'টি'); ফিরুন রাউন্ড (পাউ (1024, $ বেস - মেঝে ($ বেস)), $ নির্ভুলতা)। $ প্রত্যয় [মেঝে ($ বেস)]; }
ক্রিস্টোফার গ্রে

formatBytes(259748192, 3)রিটার্ন 259748192 MBযা সঠিক নয়
ফ্লিপ করুন


15

এটি কোহানার বাস্তবায়ন, আপনি এটি ব্যবহার করতে পারেন:

public static function bytes($bytes, $force_unit = NULL, $format = NULL, $si = TRUE)
{
    // Format string
    $format = ($format === NULL) ? '%01.2f %s' : (string) $format;

    // IEC prefixes (binary)
    if ($si == FALSE OR strpos($force_unit, 'i') !== FALSE)
    {
        $units = array('B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB');
        $mod   = 1024;
    }
    // SI prefixes (decimal)
    else
    {
        $units = array('B', 'kB', 'MB', 'GB', 'TB', 'PB');
        $mod   = 1000;
    }

    // Determine unit to use
    if (($power = array_search((string) $force_unit, $units)) === FALSE)
    {
        $power = ($bytes > 0) ? floor(log($bytes, $mod)) : 0;
    }

    return sprintf($format, $bytes / pow($mod, $power), $units[$power]);
}

1024 এবং 1000 পাওয়ারের মধ্যে একটি বিকল্প থাকার তাদের ধারণাটি ভাল। তবে এই বাস্তবায়নটি সত্যই অদ্ভুত। $force_unitএবং $siএকই জিনিস বলে মনে হচ্ছে। আপনি এটিতে "i" দিয়ে যে কোনও স্ট্রিংও পাস করতে পারেন $force_unit, কারণ তারা অবস্থানের জন্য পরীক্ষা করে। দশমিক বিন্যাসও ওভারকিল।
গস 0

14

কেবল কেবি এর জন্য 1024, এমবি এর জন্য 1024 ^ 2 এবং জিবি এর জন্য 1024 ^ 3 দ্বারা ভাগ করুন। এর মত সহজ.


8

কেবলমাত্র আমার বিকল্প, সংক্ষিপ্ত এবং পরিষ্কার:

/**
 * @param int $bytes Number of bytes (eg. 25907)
 * @param int $precision [optional] Number of digits after the decimal point (eg. 1)
 * @return string Value converted with unit (eg. 25.3KB)
 */
function formatBytes($bytes, $precision = 2) {
    $unit = ["B", "KB", "MB", "GB"];
    $exp = floor(log($bytes, 1024)) | 0;
    return round($bytes / (pow(1024, $exp)), $precision).$unit[$exp];
}

বা, আরও বোকা এবং কার্যকর:

function formatBytes($bytes, $precision = 2) {
    if ($bytes > pow(1024,3)) return round($bytes / pow(1024,3), $precision)."GB";
    else if ($bytes > pow(1024,2)) return round($bytes / pow(1024,2), $precision)."MB";
    else if ($bytes > 1024) return round($bytes / 1024, $precision)."KB";
    else return ($bytes)."B";
}

7

আপনি যদি একটি সংক্ষিপ্ত কোড চান তবে এই ফাংশনটি ব্যবহার করুন

bcdiv ()

$size = 11485760;
echo bcdiv($size, 1048576, 0); // return: 10

echo bcdiv($size, 1048576, 2); // return: 10,9

echo bcdiv($size, 1048576, 2); // return: 10,95

echo bcdiv($size, 1048576, 3); // return: 10,953

6

আমি জানি এই প্রশ্নের উত্তর দিতে হয়তো কিছুটা দেরি হয়েছে তবে, আরও ডেটা কাউকে মেরে ফেলছে না। এখানে একটি খুব দ্রুত ফাংশন:

function format_filesize($B, $D=2){
    $S = 'BkMGTPEZY';
    $F = floor((strlen($B) - 1) / 3);
    return sprintf("%.{$D}f", $B/pow(1024, $F)).' '.@$S[$F].'B';
}

সম্পাদনা: ক্যামোমাইলকেস প্রস্তাবিত ফিক্সটি অন্তর্ভুক্ত করার জন্য আমি আমার পোস্ট আপডেট করেছি:

function format_filesize($B, $D=2){
    $S = 'kMGTPEZY';
    $F = floor((strlen($B) - 1) / 3);
    return sprintf("%.{$D}f", $B/pow(1024, $F)).' '.@$S[$F-1].'B';
}

1
আপনি around বি এর ছোট মানগুলির জন্য একটি ডাবল বি (বিবি) পান, আপনার চারপাশের কাজ হিসাবে "$ এস = 'কেএমজিপিটিজাই'" তৈরি করতে পারে এবং "@ $ এস [$ এফ]" "ডু" @ $ এস [$ এফ 1] "।
ক্যামোমাইলকেস

@ ক্যামোমাইলকেস আড়াই বছর পরে - আমি আমার উত্তর আপডেট করেছি। ধন্যবাদ।
ডেভিড বেলঞ্জার

4

সাধারণ ফাংশন

function formatBytes($size, $precision = 0){
    $unit = ['Byte','KiB','MiB','GiB','TiB','PiB','EiB','ZiB','YiB'];

    for($i = 0; $size >= 1024 && $i < count($unit)-1; $i++){
        $size /= 1024;
    }

    return round($size, $precision).' '.$unit[$i];
}

echo formatBytes('1876144', 2);
//returns 1.79 MiB

3

নমনীয় সমাধান:

function size($size, array $options=null) {

    $o = [
        'binary' => false,
        'decimalPlaces' => 2,
        'decimalSeparator' => '.',
        'thausandsSeparator' => '',
        'maxThreshold' => false, // or thresholds key
        'suffix' => [
            'thresholds' => ['', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'],
            'decimal' => ' {threshold}B',
            'binary' => ' {threshold}iB',
            'bytes' => ' B'
        ]
    ];

    if ($options !== null)
        $o = array_replace_recursive($o, $options);

    $base = $o['binary'] ? 1024 : 1000;
    $exp = $size ? floor(log($size) / log($base)) : 0;

    if (($o['maxThreshold'] !== false) &&
        ($o['maxThreshold'] < $exp)
    )
        $exp = $o['maxThreshold'];

    return !$exp
        ? (round($size) . $o['suffix']['bytes'])
        : (
            number_format(
                $size / pow($base, $exp),
                $o['decimalPlaces'],
                $o['decimalSeparator'],
                $o['thausandsSeparator']
            ) .
            str_replace(
                '{threshold}',
                $o['suffix']['thresholds'][$exp],
                $o['suffix'][$o['binary'] ? 'binary' : 'decimal']
            )
        );
}

var_dump(size(disk_free_space('/')));
// string(8) "14.63 GB"
var_dump(size(disk_free_space('/'), ['binary' => true]));
// string(9) "13.63 GiB"
var_dump(size(disk_free_space('/'), ['maxThreshold' => 2]));
// string(11) "14631.90 MB"
var_dump(size(disk_free_space('/'), ['binary' => true, 'maxThreshold' => 2]));
// string(12) "13954.07 MiB"

2

আমি নিম্নলিখিত ফাংশন দিয়ে সফল,

    function format_size($size) {
        $mod = 1024;
        $units = explode(' ','B KB MB GB TB PB');
        for ($i = 0; $size > $mod; $i++) {
            $size /= $mod;
        }
        return round($size, 2) . ' ' . $units[$i];
    }

2
সাবধানতা: কে কেলভিনের জন্য এবং কে কিলোর জন্য।
জেওয়ারেন

2

আমার পদ্ধতির

    function file_format_size($bytes, $decimals = 2) {
  $unit_list = array('B', 'KB', 'MB', 'GB', 'PB');

  if ($bytes == 0) {
    return $bytes . ' ' . $unit_list[0];
  }

  $unit_count = count($unit_list);
  for ($i = $unit_count - 1; $i >= 0; $i--) {
    $power = $i * 10;
    if (($bytes >> $power) >= 1)
      return round($bytes / (1 << $power), $decimals) . ' ' . $unit_list[$i];
  }
}

2

অন্যের মতো আপনার কেন এতো জটিল করা উচিত তা আমি জানি না।

নিম্নলিখিত কোডটি বোঝার জন্য আরও সহজ এবং লগ ফাংশনটি ব্যবহার করে এমন অন্যান্য সমাধানের তুলনায় প্রায় 25% দ্রুত (ফাংশনটি 20 Mio. বিভিন্ন পরামিতি সহ সময় বলা হয়)

function formatBytes($bytes, $precision = 2) {
    $units = ['Byte', 'Kilobyte', 'Megabyte', 'Gigabyte', 'Terabyte'];
    $i = 0;

    while($bytes > 1024) {
        $bytes /= 1024;
        $i++;
    }
    return round($bytes, $precision) . ' ' . $units[$i];
}

2

আমি এই সমস্ত ইনপুটকে বাইটে রূপান্তরিত করেছি এবং তাই প্রয়োজনীয় কোনও আউটপুটে রূপান্তর করেছি। এছাড়াও, আমি বেস 1000 বা 1024 পেতে একটি সহায়ক ফাংশন ব্যবহার করেছি, তবে জনপ্রিয় ধরণের (এমবি এর পরিবর্তে এমবি নয়) 'আই' ছাড়াই 1024 ব্যবহারের সিদ্ধান্ত নিতে এটি নমনীয় করে ফেলেছি।

    public function converte_binario($size=0,$format_in='B',$format_out='MB',$force_in_1024=false,$force_out_1024=false,$precisao=5,$return_format=true,$decimal=',',$centena=''){
    $out = false;

    if( (is_numeric($size)) && ($size>0)){
        $in_data = $this->converte_binario_aux($format_in,$force_in_1024);
        $out_data = $this->converte_binario_aux($format_out,$force_out_1024);

        // se formato de entrada e saída foram encontrados
        if( ((isset($in_data['sucesso'])) && ($in_data['sucesso']==true)) && ((isset($out_data['sucesso'])) && ($out_data['sucesso']==true))){
            // converte formato de entrada para bytes.
            $size_bytes_in = $size * (pow($in_data['base'], $in_data['pot']));
            $size_byte_out = (pow($out_data['base'], $out_data['pot']));
            // transforma bytes na unidade de destino
            $out = number_format($size_bytes_in / $size_byte_out,$precisao,$decimal,$centena);
            if($return_format){
                $out .= $format_out;
            }
        }
    }
    return $out;
}

public function converte_binario_aux($format=false,$force_1024=false){
    $out = [];
    $out['sucesso'] = false;
    $out['base'] = 0;
    $out['pot'] = 0;
    if((is_string($format) && (strlen($format)>0))){
        $format = trim(strtolower($format));
        $units_1000 = ['b','kb' ,'mb' ,'gb' ,'tb' ,'pb' ,'eb' ,'zb' ,'yb' ];
        $units_1024 = ['b','kib','mib','gib','tib','pib','eib','zib','yib'];
        $pot = array_search($format,$units_1000);
        if( (is_numeric($pot)) && ($pot>=0)){
            $out['pot'] = $pot;
            $out['base'] = 1000;
            $out['sucesso'] = true;
        }
        else{
            $pot = array_search($format,$units_1024);
            if( (is_numeric($pot)) && ($pot>=0)){
                $out['pot'] = $pot;
                $out['base'] = 1024;
                $out['sucesso'] = true;
            }
        }
        if($force_1024){
            $out['base'] = 1024;
        }
    }
    return $out;
}

1

এটা চেষ্টা কর ;)

function bytesToSize($bytes) {
                $sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
                if ($bytes == 0) return 'n/a';
                $i = intval(floor(log($bytes) / log(1024)));
                if ($i == 0) return $bytes . ' ' . $sizes[$i]; 
                return round(($bytes / pow(1024, $i)),1,PHP_ROUND_HALF_UP). ' ' . $sizes[$i];
            }
echo bytesToSize(10000050300);

1
function changeType($size, $type, $end){
    $arr = ['B', 'KB', 'MB', 'GB', 'TB'];
    $tSayi = array_search($type, $arr);
    $eSayi = array_search($end, $arr);
    $pow = $eSayi - $tSayi;
    return $size * pow(1024 * $pow) . ' ' . $end;
}

echo changeType(500, 'B', 'KB');

1
function convertToReadableSize($size)
{
  $base = log($size) / log(1024);
  $suffix = array("B", "KB", "MB", "GB", "TB");
  $f_base = floor($base);
  return round(pow(1024, $base - floor($base)), 1) . $suffix[$f_base];
}

শুধু ফাংশন কল

echo convertToReadableSize(1024); // Outputs '1KB'
echo convertToReadableSize(1024 * 1024); // Outputs '1MB'

1

শেষ পিএইচপি দিয়ে এই কাজ

function formatBytes($bytes, $precision = 2) { 
    $units = array('B', 'KB', 'MB', 'GB', 'TB'); 

    $bytes = max($bytes, 0); 
    $pow = floor(($bytes ? log($bytes) : 0) / log(1024)); 
    $pow = min($pow, count($units) - 1); 

    $bytes /= pow(1024, $pow); 

    return round($bytes, $precision) . ' ' . $units[$pow]; 
} 

সেখানে যা কিছু করা হয়েছিল তা হ'ল পিএইচপি.এন. এর একটি উদাহরণের ঠিক একই অনুলিপি যা মূল উত্তরদাতারা 2010 সালে ফিরে এসেছিল কেবল 8 বছর পরে এটি করেছে।
জেকগল্ড

1

কিছুটা বাসি হলেও এই গ্রন্থাগারটি একটি পরীক্ষিত এবং শক্তিশালী রূপান্তর API সরবরাহ করে:

https://github.com/gabrielelana/byte-units

একবার ইনস্টল:

\ByteUnits\Binary::bytes(1024)->format();

// Output: "1.00KiB"

এবং অন্য দিকে রূপান্তর করতে:

\ByteUnits\Binary::parse('1KiB')->numberOfBytes();

// Output: "1024"

প্রাথমিক রূপান্তর ছাড়াই এটি সংযোজন, বিয়োগ, তুলনা ইত্যাদির জন্য পদ্ধতি সরবরাহ করে offers

আমি এই লাইব্রেরির সাথে কোনওভাবেই যুক্ত নয়।


0
function byte_format($size) {
    $bytes = array( ' KB', ' MB', ' GB', ' TB' );
    foreach ($bytes as $val) {
        if (1024 <= $size) {
            $size = $size / 1024;
            continue;
        }
        break;
    }
    return round( $size, 1 ) . $val;
}

0

এখানে ড্রুপাল ফর্ম্যাট_সাইজ ফাংশনটির সরলীকৃত বাস্তবায়ন রয়েছে :

/**
 * Generates a string representation for the given byte count.
 *
 * @param $size
 *   A size in bytes.
 *
 * @return
 *   A string representation of the size.
 */
function format_size($size) {
  if ($size < 1024) {
    return $size . ' B';
  }
  else {
    $size = $size / 1024;
    $units = ['KB', 'MB', 'GB', 'TB'];
    foreach ($units as $unit) {
      if (round($size, 2) >= 1024) {
        $size = $size / 1024;
      }
      else {
        break;
      }
    }
    return round($size, 2) . ' ' . $unit;
  }
}

0

এটি কিছুটা দেরি হলেও গ্রহণযোগ্য উত্তরের কিছুটা দ্রুত সংস্করণ নীচে রয়েছে:

function formatBytes($bytes, $precision)
{
    $unit_list = array
    (
        'B',
        'KB',
        'MB',
        'GB',
        'TB',
    );

    $bytes = max($bytes, 0);
    $index = floor(log($bytes, 2) / 10);
    $index = min($index, count($unit_list) - 1);
    $bytes /= pow(1024, $index);

    return round($bytes, $precision) . ' ' . $unit_list[$index];
}

দুটি লগ-ই ক্রিয়াকলাপের পরিবর্তে একক লগ -২ অপারেশন করার কারণে এটি আরও দক্ষ।

নীচে আরও সুস্পষ্ট সমাধান করার জন্য এটি আসলে দ্রুত, তবে:

function formatBytes($bytes, $precision)
{
    $unit_list = array
    (
        'B',
        'KB',
        'MB',
        'GB',
        'TB',
    );

    $index_max = count($unit_list) - 1;
    $bytes = max($bytes, 0);

    for ($index = 0; $bytes >= 1024 && $index < $index_max; $index++)
    {
        $bytes /= 1024;
    }

    return round($bytes, $precision) . ' ' . $unit_list[$index];
}

এটি কারণ সূচকটি যথাযথ ইউনিটে বাইটের সংখ্যার মান হিসাবে একই সময়ে গণনা করা হয়। এটি প্রায় 35% (55% গতি বৃদ্ধি) দ্বারা ফাঁসির সময় কেটে দেয়।


0

আরও একটি ঘনীভূত বাস্তবায়ন যা বেস 1024 (বাইনারি) বা বেস 1000 (দশমিক) এ অনুবাদ করতে পারে এবং বিসি লাইব্রেরির ব্যবহারের কারণে অবিশ্বাস্যরকম বিশাল সংখ্যার সাথেও কাজ করে:

function renderSize($byte,$precision=2,$mibi=true)
{
    $base = (string)($mibi?1024:1000);
    $labels = array('K','M','G','T','P','E','Z','Y');
    for($i=8;$i>=1;$i--)
        if(bccomp($byte,bcpow($base, $i))>=0)
            return bcdiv($byte,bcpow($base, $i), $precision).' '.$labels[$i-1].($mibi?'iB':'B');
    return $byte.' Byte';
}

শুধু একটু পার্শ্ব নোট; bcpow()TypeError ব্যতিক্রম যদি নিক্ষেপ করা হবে $baseএবং $iস্ট্রিং মান নয়। পিএইচপি সংস্করণ 7.0.11 এ পরীক্ষিত।
ডেভিড কেরি

ধন্যবাদ! আমি স্ট্রিং কেস্টার যুক্ত করেছি এবং একটি অফসেট বাগ ঠিক করেছি :)
খ্রিস্টান

0

আমি অনুভব করেছি যে আমি দুটি সাবমিটার কোডের জাল যুক্ত করব (জন হিমেলম্যানের কোডটি যা এই থ্রেডে রয়েছে এবং ইউজিন কুজমেনকো কোড ব্যবহার করছি) যা আমি ব্যবহার করছি।

function swissConverter($value, $format = true, $precision = 2) {
    //Below converts value into bytes depending on input (specify mb, for 
    //example)
    $bytes = preg_replace_callback('/^\s*(\d+)\s*(?:([kmgt]?)b?)?\s*$/i', 
    function ($m) {
        switch (strtolower($m[2])) {
          case 't': $m[1] *= 1024;
          case 'g': $m[1] *= 1024;
          case 'm': $m[1] *= 1024;
          case 'k': $m[1] *= 1024;
        }
        return $m[1];
        }, $value);
    if(is_numeric($bytes)) {
        if($format === true) {
            //Below converts bytes into proper formatting (human readable 
            //basically)
            $base = log($bytes, 1024);
            $suffixes = array('', 'KB', 'MB', 'GB', 'TB');   

            return round(pow(1024, $base - floor($base)), $precision) .' '. 
                     $suffixes[floor($base)];
        } else {
            return $bytes;
        }
    } else {
        return NULL; //Change to prefered response
    }
}

এই ফরম্যাট করতে ইউজিন এর কোড ব্যবহার $value(আমি মেগাবাইট আমার ডেটা রাখতে, তাই এটি আমার ডেটা পরিবর্তন করে: বাইট মধ্যে 10485760 MBমধ্যে 10995116277760) - তখন এটা সঠিক প্রদর্শন মান (মধ্যে রূপান্তর করতে জনস কোড ব্যবহার 10995116277760মধ্যে 10 TB)।

আমি এটি সত্যিই সহায়ক খুঁজে পেয়েছি - সুতরাং দুটি জমা দেওয়ার জন্য আমার ধন্যবাদ!


0

মানব ফাইলের আকার পেতে অত্যন্ত সাধারণ ফাংশন।

আসল উত্স: http://php.net/manual/de/function.filesize.php#106569

কোড অনুলিপি করুন:

<?php
function human_filesize($bytes, $decimals = 2) {
  $sz = 'BKMGTP';
  $factor = floor((strlen($bytes) - 1) / 3);
  return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor];
}
?>

0

আমি আমার নিজস্ব ফাংশন বিকাশ করেছি যা মানব পাঠযোগ্য মেমরির আকারকে বিভিন্ন আকারে রূপান্তর করে।

function convertMemorySize($strval, string $to_unit = 'b')
{
    $strval    = strtolower(str_replace(' ', '', $strval));
    $val       = floatval($strval);
    $to_unit   = strtolower(trim($to_unit))[0];
    $from_unit = str_replace($val, '', $strval);
    $from_unit = empty($from_unit) ? 'b' : trim($from_unit)[0];
    $units     = 'kmgtph';  // (k)ilobyte, (m)egabyte, (g)igabyte and so on...


    // Convert to bytes
    if ($from_unit !== 'b')
        $val *= 1024 ** (strpos($units, $from_unit) + 1);


    // Convert to unit
    if ($to_unit !== 'b')
        $val /= 1024 ** (strpos($units, $to_unit) + 1);


    return $val;
}


convertMemorySize('1024Kb', 'Mb');  // 1
convertMemorySize('1024', 'k')      // 1
convertMemorySize('5.2Mb', 'b')     // 5452595.2
convertMemorySize('10 kilobytes', 'bytes') // 10240
convertMemorySize(2048, 'k')        // By default convert from bytes, result is 2

এই ফাংশনটি "মেগাবাইট, এমবি, এমবি, এমবি, এম, কিলোবাইট, কে, কেবি, বি, টেরাবাইট, টি ...." এর মতো কোনও মেমরি আকারের সংক্ষেপণ গ্রহণ করে তাই এটি টাইপো নিরাপদ।


0

লিওর উত্তরের ভিত্তিতে , যোগ করুন

  • নেতিবাচক জন্য সমর্থন
  • সমর্থন 0 <মান <1 (উদা: ০.২, লগ (মান) = নেতিবাচক সংখ্যা সৃষ্টি করবে)

আপনি যদি মেগায় সর্বাধিক ইউনিট চান তবে এটিকে পরিবর্তন করুন $units = explode(' ', ' K M');


function formatUnit($value, $precision = 2) {
    $units = explode(' ', ' K M G T P E Z Y');

    if ($value < 0) {
        return '-' . formatUnit(abs($value));
    }

    if ($value < 1) {
        return $value . $units[0];
    }

    $power = min(
        floor(log($value, 1024)),
        count($units) - 1
    );

    return round($value / pow(1024, $power), $precision) . $units[$power];
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.