приведение размер файла к человеко-понятной форме

alan4ick

Guest
приведение размер файла к человеко-понятной форме

Как можно привести размер файла в байтах к человеко удобной форме, т.е. Мб , Гб...

Пока делаю так, но как длинно:

$ext=array('b','Kb','Mb',....)

на ум приходит только нахождение делителя через сравнение по циклу

1024*$n >= $filesize < 1024*($n+1)

а потом уже получаем результат

round($filesize/pow(1024,$n),2).' '.$ext[$n]


Может есть способ покороче ?
 

Popoff

popoff.donetsk.ua
б - бит
Б - байт
Мб - мегабит
"1.2 МБ", по-твоему, плохо смотрится?
 

alan4ick

Guest
Я имею ввиду удачный ли я использую алгоритм для нахождения делителя, или можно еще проще сделать?
 

bkonst

.. хочется странного?...
Можно просто написать несколько условий - объем файла более 1 Гб, более 1 Мб, более 1 К, прочие. Код будет немного более читаемым, чем поиск делителя в цикле.
 

SiMM

Новичок
Математику в школе надо было учить :)
PHP:
$n = $filesize ? floor(log($filesize)/log(1024)) : 0;
 

alan4ick

Guest
SiMM
Да...про логарифмы и забыли... спасибо что напомнил... :)
Чуствовал..что что-то упустил

-~{}~ 22.01.06 12:01:

bkonst
это не универсально
 

bkonst

.. хочется странного?...
Что значит "не универсально"?! Найдется достаточно большой набор файлов которые под эти условия не подходят? :D

Это как сортировка: если массив всегда будет содержать 3 элемента, не имеет смысл реализовывать "настоящий" алгоритм. Так и в этом случае - количество градаций четко зафиксировано и мало (б, кб, мб, гб). Универсальность в данном конкретном случае излишня...
 

alan4ick

Guest
вместо старых 12 строк теперь всего 5-ть.

PHP:
function get_hsize($filesize)
{
	$ext=array('б','Кб','Мб','Гб','Тб');
	$ext_count=count($ext);

	$n=$filesize ? floor(log($filesize)/log(1024)) : 0;
	if( $n>=$ext_count ) $n=$ext_count-1;

	return (round($filesize/pow(1024,$n),2).' '.$ext[$n]);
}
 

SiMM

Новичок
> вместо старых 12 строк теперь всего 5-ть.
Хы...
PHP:
function get_hsize($filesize) {
  foreach (array(0x40000000=>'Гб', 0x100000=>'Мб', 0x400=>'Кб', 1=>'б') as $k=>$v)
    if ($filesize >= $k) return round($filesize/$k).' '.$v;
  return '0 б';
}
 

bkonst

.. хочется странного?...
SiMM
Я в восхищении :) Это получилось даже более изящно, чем я думал.
 

alan4ick

Guest
bkonst
в моем варианте код более отделен от представления :)
 

bkonst

.. хочется странного?...
А.. а... а мы сейчас array(...) в отдельную переменную вынесем! :p
 
Сверху