Skip to content

Instantly share code, notes, and snippets.

@ignamv
Created May 21, 2016 19:30
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ignamv/1dde19d5a15f4562c86fade74ded2f7e to your computer and use it in GitHub Desktop.
Save ignamv/1dde19d5a15f4562c86fade74ded2f7e to your computer and use it in GitHub Desktop.
Python SI prefix formatting
def format_si(number, significant_digits=3):
"""Format number using SI prefixes
The prefix is chosen such that the number before the prefix is 1<x<1000."""
if number == 0:
return '0 '
prefixes = list('afpnμm') + [''] + list('kMGTPE')
multipliers = 10.**np.arange(-18, 19, 3)
inv_multipliers = 10.**(-np.arange(-18, 19, 3))
abs_number = abs(number)
index = np.searchsorted(multipliers, abs_number) - 1
prefix = prefixes[index]
number *= inv_multipliers[index]
abs_number = inv_multipliers[index] * abs_number
if (abs_number > 1000 or abs_number < 1) and (
index == -1 or index == len(multipliers)-1):
format_ = '{:.3e} '
number *= multipliers[index]
else:
if abs_number < 10:
digits_before_comma = 1
elif abs_number < 100:
digits_before_comma = 2
else:
digits_before_comma = 3
decimals = max(0, significant_digits - digits_before_comma)
format_ = '{:.' + str(decimals) + 'f} {}'
return format_.format(number, prefix)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment