40 lines
1.8 KiB
Python
40 lines
1.8 KiB
Python
|
def friendly_number(number, base=1000, decimals=0, suffix='',
|
||
|
powers=['', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']):
|
||
|
"""
|
||
|
Format a number as friendly text, using common suffixes.
|
||
|
"""
|
||
|
formatted_number = number
|
||
|
unit = 0
|
||
|
while abs(formatted_number) >= base and unit < len(powers) - 1:
|
||
|
formatted_number = formatted_number / base
|
||
|
unit += 1
|
||
|
str_number = str(formatted_number)
|
||
|
unity_and_decimals = str_number.split(".")
|
||
|
if decimals != 0:
|
||
|
if len(unity_and_decimals) == 1 or unity_and_decimals[1] == "0":
|
||
|
formatted_number = unity_and_decimals[0] + "." + ("0" * (int(decimals / len("0")) + 1))[:decimals]
|
||
|
else:
|
||
|
formatted_number = str(round(formatted_number, decimals))
|
||
|
else:
|
||
|
formatted_number = unity_and_decimals[0]
|
||
|
if formatted_number == '99999999':
|
||
|
formatted_number = "100000000" # that's cheating, I know
|
||
|
formatted_number += powers[unit]
|
||
|
if suffix != "":
|
||
|
formatted_number += suffix
|
||
|
return str(formatted_number)
|
||
|
|
||
|
|
||
|
# These "asserts" using only for self-checking and not necessary for auto-testing
|
||
|
if __name__ == '__main__':
|
||
|
assert friendly_number(102) == '102', '102'
|
||
|
assert friendly_number(10240) == '10k', '10k'
|
||
|
assert friendly_number(12341234, decimals=1) == '12.3M', '12.3M'
|
||
|
assert friendly_number(12461, decimals=1) == '12.5k', '12.5k'
|
||
|
assert friendly_number(1024000000, base=1024, suffix='iB') == '976MiB', '976MiB'
|
||
|
assert friendly_number(12000000, decimals=3) == '12.000M', '12.000M'
|
||
|
assert friendly_number(102, decimals=2) == '102.00', '102.00'
|
||
|
assert friendly_number(-150, base=100, powers=["", "d", "D"]) == '-1d', '-1d'
|
||
|
assert friendly_number(255000000000, powers=["", "k", "M"]) == '255000M', '255000M'
|
||
|
assert friendly_number(10**32) == '100000000Y', '100000000Y'
|