Human readable file sizes
Posted 5 April 2004
A very common task is converting a number of bytes into something for human digestion. This function supports both a maximum unit, both SI prefixes (base 10) and binary prefixes (base 2), and customised return strings.
<?php
/**
* Return human readable sizes
*
* @author Aidan Lister <aidan@php.net>
* @version 1.3.0
* @link http://aidanlister.com/2004/04/human-readable-file-sizes/
* @param int $size size in bytes
* @param string $max maximum unit
* @param string $system 'si' for SI, 'bi' for binary prefixes
* @param string $retstring return string format
*/
function size_readable ( $size , $max = null , $system = 'si' , $retstring = '%01.2f %s' )
{
// Pick units
$systems [ 'si' ][ 'prefix' ] = array ( 'B' , 'K' , 'MB' , 'GB' , 'TB' , 'PB' );
$systems [ 'si' ][ 'size' ] = 1000 ;
$systems [ 'bi' ][ 'prefix' ] = array ( 'B' , 'KiB' , 'MiB' , 'GiB' , 'TiB' , 'PiB' );
$systems [ 'bi' ][ 'size' ] = 1024 ;
$sys = isset ( $systems [ $system ]) ? $systems [ $system ] : $systems [ 'si' ];
// Max unit to display
$depth = count ( $sys [ 'prefix' ]) - 1 ;
if ( $max && false !== $d = array_search ( $max , $sys [ 'prefix' ])) {
$depth = $d ;
}
// Loop
$i = 0 ;
while ( $size >= $sys [ 'size' ] && $i < $depth ) {
$size /= $sys [ 'size' ];
$i ++ ;
}
return sprintf ( $retstring , $size , $sys [ 'prefix' ][ $i ]);
}
?>
An example:
<?php
// Simple
echo "Simple: \n " ;
echo size_readable ( 5500 ), " \n " ;
echo size_readable ( 17139812000 ), " \n " ;
// Maximum unit
echo "Max units in MB: \n " ;
echo size_readable ( 81620000000 , 'MB' ), " \n " ;
// 4 decimal accuracy
echo "4 decimals: \n " ;
echo size_readable ( 91711816100 , null , true , '%01.4f %s' ), " \n " ;
// 1 decimal accuracy, units in brackets, max unit in MB
echo "1 decimal, units in brackets, max unit of MB: \n " ;
$size = disk_total_space ( '/home' );
echo size_readable ( $size , 'MB' , true , '%01.1f (%s)' );
?>
This would result in:
Simple:
5.50 K
17.14 GB
Max units in MB:
81620.00 MB
4 decimals:
91.7118 GB
1 decimal, units in brackets, max unit of MB:
1231.2 (MB)
</code>