PHP форматирование чисел, когда менее 1 МБ - PullRequest
1 голос
/ 12 февраля 2011

Надеюсь, что кто-то может понять это.

Я использую это для отображения размеров файлов нескольких файлов в папке ...

number_format (round (filesize($currentfile) /1048576)) . "mb"

... который отображает мои имена файлов так:

27MB
35MB
10 МБ

и т.д.

Но, если размер файла меньше 1 МБ, он отображается на экране как:

0MB

Как я могу изменить PHP так, чтобы, если он встречает файл размером 250 тыс., Например, он отображал как ".25mb"?

Заранее спасибо.

Ответы [ 5 ]

3 голосов
/ 12 февраля 2011

Ну, вам нужно удалить вызов round, он делает целые числа:

number_format (filesize($currentfile) /1048576, 2) . "mb"

Который даст:

27mb
35mb
10.25mb < if it's really 10.25mb
0.25mb
2 голосов
/ 12 февраля 2011

Лучше создать функцию, чтобы вы могли повторно использовать ее в другом месте в своем приложении, тогда, если вы решите изменить форматирование или что-то позднее, вы можете легко сделать это в одном месте. Я уверен, что есть что-то более элегантное, но для простоты вот что я только что взбил:

function pretty_size($bytes, $dec_places = 1) {

    $total = $bytes / 1024 / 1024 / 1024 / 1024;
    $unit = 'TB';

    if( $total < 1 ) {
        $total = $bytes / 1024 / 1024 / 1024;
        $unit = 'GB';
    }

    if( $total < 1 ) {
        $total = $bytes / 1024 / 1024;
        $unit = 'MB';
    }

    if( $total < 1 ) {
        $total = $bytes / 1024;
        $unit = 'KB';
    }

    if( $total < 1 ) {
        $total = $bytes;
        $unit = 'bytes';
    }

    return array(number_format($total, $dec_places), $unit);

}

Вы можете проверить это, используя:

$numbers = array(
    89743589734434,
    39243243223,
    3456544,
    12342443,
    324324,
    4233,
    2332,
    32
);

foreach( $numbers as $n ) {
    $size = pretty_size($n);
    echo $size[0] . ' ' . $size[1] . '<br />';
}

Приведенный выше код будет производить это:

81.6 TB
36.5 GB
3.3 MB
11.8 MB
316.7 KB
4.1 KB
2.3 KB
32.0 bytes

Конечно, если вы действительно хотите ограничить отображение только мегабайтами, вы можете соответственно изменить функцию. Достаточно просто:)

1 голос
/ 12 февраля 2011

Более надежный:

function fsize_fmt($bytes, $precision=2) {
    $unit = array('B', 'KB', 'MB', 'GB', 'TB', 'PB');
    for ($x=0; $bytes>=1024 && $x<count($unit); $x++) { $bytes /= 1024; }
    return round($bytes, $precision) . ' ' . $unit[$x];
}
0 голосов
/ 12 февраля 2011
if((filesize($currentfile) /1048576) >= 1)
    number_format (round (filesize($currentfile) /1048576), 1) . "mb";
else
    number_format (filesize($currentfile) /1048576, 2) . "mb"
0 голосов
/ 12 февраля 2011

Ну, вам просто нужно проверить, если он меньше 1 МБ, и обращаться с ним по-другому.

number_format (filesize($currentfile) / 1048576, (filesize($currentfile) < 1048576 ? 2 : 0)) . "mb"
...