Рассмотрим функцию, которая преобразует количество байтов в читаемую человеком строку:
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)
Я ищу функцию, которая, учитывая читаемую человеком строку, вернула бы границы этого размера (min, max) в байтах, что составляет 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
Но это решение дает только приблизительные значения