Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for Friendly Number by Molot
from math import floor, ceil
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.
"""
def reduce_number(number, base, max_n=9, n=1):
# returns reduced number and math order
if (number / pow(base,n) >= base) and n < max_n:
return reduce_number(number, base, max_n, n+1)
return number / pow(base,n), n
end = powers[0]
if abs(number) < base:
return f'{number:.{decimals}f}' + end + suffix
number, order = reduce_number(number, base, max_n=len(powers)-1)
end = powers[order] + suffix
if not decimals:
number = floor(number) if number >=0 else ceil(number)
return f'{number:.{decimals}f}' + end
#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'
June 24, 2018