Удобочитаемый размер в диапазоне байтов

Рассмотрим функцию, которая преобразует количество байтов в удобочитаемую строку:

def sizeof_fmt(num, suffix='B'):
    for unit in ['','Ki','Mi','Gi','Ti','Pi','Ei','Zi']:
        if abs(num) < 1024.0:
            return "%3.1f %s%s" % (num, unit, suffix)
        num /= 1024.0
    return "%.1f %s%s" % (num, 'Yi', suffix)

Я ищу функцию, которая, учитывая читаемую человеком строку, вернет границы этого размера (мин, макс) в байтах, составляя 1 число после запятой. Например:

human_readable_to_range('1 KiB') => 1024, 1075 1 КиБ останавливается на 1075, потому что 1076 — это 1,1 КиБ

human_readable_to_range('1.3 KiB') => 1281, 1382

human_readable_to_range('9.7 MiB') => 10118759, 10223615

Я пытался решить это так:

def human_readable_to_range(size):
  MULTIPLIERS = {
    'KiB': 2**10,
    'MiB': 2**20
  }
  number, unit = size.split(' ')
  multiplier = MULTIPLIERS[unit]
  rough_value = float(number) * multiplier
  min_ = rough_value - multiplier * 0.5
  max_ = rough_value + multiplier * 0.5

Но это решение дает только приблизительные значения

Это кажется странным, что нужно делать, зачем вам это нужно? Может быть, есть лучший способ решить настоящую проблему.

Barmar 18.03.2019 20:39

@Barmar получил таблицу в БД, в которой хранятся размеры файлов в байтах. Нужно, чтобы пользователи моего приложения отфильтровали эту таблицу с такими вещами, как «размер файла равен 10,5 МБ», «размер файла меньше 9 КиБ»

alterionisto 18.03.2019 20:47

Перевод 10,5 МБ в определенный диапазон кажется плохим пользовательским интерфейсом. Я бы просто дал им два поля, чтобы указать конечные точки диапазона. Но это, вероятно, лучшее обсуждение для Пользовательский опыт.

Barmar 18.03.2019 21:26
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
126
2

Ответы 2

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

Поскольку вы предполагаете, что во входных данных используется только 1 десятичная цифра, добавьте и вычтите 0.05 к заданному числу и используйте это как максимальное и минимальное количество, которое затем умножьте на единицу.

def human_readable_to_range(size):
  MULTIPLIERS = {
    'KiB': 2**10,
    'MiB': 2**20
  }
  number, unit = size.split(' ')
  minnum = float(number) - 0.05
  maxnum = float(number) + 0.05
  multiplier = MULTIPLIERS[unit]
  return round(minnum * multiplier), round(maxnum * multiplier)

Другие вопросы по теме