-
Notifications
You must be signed in to change notification settings - Fork 0
/
human.py
executable file
·38 lines (35 loc) · 1.35 KB
/
human.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/env python3
import sys, os, re, math, argparse
def human_readable(n, prec=1, strip=True, decimal=False):
base = 1000 if decimal else 1024
# power = min(max((int(n).bit_length() - 1) // 10, 0), 6)
power = min(max(int(math.log(n, base)), 0), 6)
num = '{:.{}f}'.format(n / base**power, prec)
if strip and '.' in num:
num = num.rstrip('0').rstrip('.')
return num + 'BKMGTPE'[power]
def parse_human(s, decimal=False):
base = 1000 if decimal else 1024
s = s.strip().upper()
m = re.fullmatch(r'(.*?)\s*([KMGTPE])?B?', s)
power = ' KMGTPE'.index(m.group(2) or ' ')
return int(float(m.group(1)) * base**power)
if __name__ == '__main__':
p = argparse.ArgumentParser()
p.add_argument('-p', '--parse', action='store_true')
p.add_argument('-d', '--decimal', action='store_true')
p.add_argument('-P', '--precision', type=int, default=1)
p.add_argument('input', nargs='*')
args = p.parse_args()
if len(args.input) == 1 and os.path.exists(args.input[0]):
nums = open(args.input[0])
elif args.input and args.input != ['-']:
nums = args.input
else:
nums = sys.stdin
for n in nums:
if args.parse:
print(parse_human(n, args.decimal))
else:
print(human_readable(
int(n), prec=args.precision, decimal=args.decimal))