diff --git a/csppfetch/__init__.py b/csppfetch/__init__.py index 04cad6b42318c2c6aff4b78fe946fa3b9ddb23e5..54bd1db1e084e7590f6f3f3df1ee806d3436338f 100644 --- a/csppfetch/__init__.py +++ b/csppfetch/__init__.py @@ -96,21 +96,45 @@ class FileSet: def human_bytes(total_bytes): + """ return nicely formatted string for a count of bytes + + The result is rounded to the displayed precision, + so (1024**2)-512 is "1.00 MiB" but (1024**2)-513 is "1023 KiB" + + >>> human_bytes(0) + '0 B' + >>> human_bytes(3836163) + '3.66 MiB' + >>> human_bytes((1024**2)-512) + '1.00 MiB' + >>> human_bytes((1024**2)-513) + '1023 KiB' + >>> human_bytes(7763153400) + '7.23 GiB' + """ step_size = 1024 + # Yes, it's "Ki", not "ki". steps = "Ki Mi Gi Ti Pi Ei".split() # If you prefer the non-binary SI prefixes # step_size = 1000 - # steps = [""]+list("kMGTPE") + # steps = "kMGTPE" if total_bytes < step_size: return f"{total_bytes} B" value = total_bytes step = -1 - while value >= step_size: + while round(value,0) >= step_size: step += 1 value /= step_size - value_str = f"{value:f}"[:4] - if value_str[-1] == ".": - value_str = value_str[:-1] + + if round(value, 2) < 10: + value = round(value, 2) + value_str = f"{value:.2f}" + elif round(value, 1) < 100: + value = round(value, 1) + value_str = f"{value:.1f}" + else: + value = round(value, 0) + value_str = f"{value:.0f}" return f"{value_str} {steps[step]}B" @@ -145,7 +169,7 @@ class DownloadStatistics: self.finish() speed = self.downloaded_size/(self.total_time().total_seconds()) if speed < 100: - speed_str = "{speed} B" + speed_str = f"{speed} B" else: speed_str = human_bytes(speed) ret = [