From cbc4ffa6cd5b218780d936bb67867aad11042013 Mon Sep 17 00:00:00 2001
From: Alan De Smet <alan.desmet@ssec.wisc.edu>
Date: Fri, 6 Aug 2021 15:54:40 -0500
Subject: [PATCH] Better byte count formatting
---
csppfetch/__init__.py | 36 ++++++++++++++++++++++++++++++------
1 file changed, 30 insertions(+), 6 deletions(-)
diff --git a/csppfetch/__init__.py b/csppfetch/__init__.py
index 04cad6b..54bd1db 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 = [
--
GitLab