Форматирование количества / емкости данных в виде строки - PullRequest
3 голосов
/ 15 ноября 2010

Распространенной задачей во многих программах является преобразование количества байтов (например, из емкости диска или размера файла) в более удобочитаемую форму.Считайте 150000000000 байт более читабельными как «150 ГБ» или «139,7 ГБ».

Существуют ли какие-либо библиотеки, которые содержат функции для выполнения этих преобразований?В питоне?В с?В псевдокоде?Существуют ли передовые практики в отношении «наиболее читаемой» формы, такие как количество значащих символов, точность и т. Д .?

Ответы [ 3 ]

7 голосов
/ 15 ноября 2010

Вот метод, который использует логарифмы для определения показателя единицы размера файла:

from math import log

byteunits = ('B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB')

def filesizeformat(value):
    exponent = int(log(value, 1024))
    return "%.1f %s" % (float(value) / pow(1024, exponent), byteunits[exponent])
1 голос
/ 15 ноября 2010

Я не уверен, что здесь есть такая вещь, как лучшая практика, но есть некоторые вопросы, которые необходимо рассмотреть. Вам нужно ответить на два вопроса:

  1. Уместно ли использовать единицы base-1000 или base-1024?
  2. Когда точность начинает становиться избыточной?

Что касается использования юнитов, есть два руководства. Во-первых, всегда использует соответствующий двоичный префикс , чтобы, по крайней мере, ваши пользователи могли понять, что происходит. Во-вторых, придерживайтесь принципа наименьшего удивления и используйте любые единицы измерения, общие для вашей проблемной области . Таким образом, если вы сообщаете о размере файла в Windows, используйте base-1024, так как это то, что использует Windows. Если вы сообщаете о размерах оперативной памяти, используйте base-1024, так как всегда сообщается о размерах оперативной памяти. Если вы сообщаете о размерах жесткого диска, используйте base-1000, так как они обычно сообщаются.

Что касается точности, я думаю, что это призыв к суждению. Я не хочу сообщать о более чем одной значимой цифре, потому что в любой ситуации, в которой требуется большая точность, количество байтов является мерой, которую вы хотите сообщить.

0 голосов
/ 15 ноября 2010

Ну, я обычно так и делаю:

<?php
$factor = 0;
$units = ['B','KiB','MiB','GiB','TiB']
while( $size > 1024 && $factor<count($units-1)) {
    $factor++;
    $size /= 1024; // or $size >>= 10;
}
echo round($size,2).$units[$factor];
?>

Надеюсь, это поможет!

...