Skip to content

scientific notation with superscript exponent

An answer to this question on Stack Overflow.

Question

I'm attempting to format numbers in scientific notation with exponents of base 10, e.g. write 0.00123 as 1.23x10–3, using python 3.

I found this great function which prints 1.23x10^-3, but how can the caret-exponent be replaced with a superscript?

def sci_notation(number, sig_fig=2):
    ret_string = "{0:.{1:d}e}".format(number, sig_fig)
    a,b = ret_string.split("e")
    b = int(b)         # removed leading "+" and strips leading zeros too.
    return a + "x10^" + str(b)
print(sci_notation(0.001234, sig_fig=2))      # Outputs 1.23x10^-3

The function is modified from https://stackoverflow.com/a/29261252/8542513.

I've attempted to incorporate the answer from https://stackoverflow.com/a/8651690/8542513 to format the superscript, but I'm not sure how sympy works with variables:

from sympy import pretty_print as pp, latex
from sympy.abc import a, b, n
def sci_notation(number, sig_fig=2):
  ret_string = "{0:.{1:d}e}".format(number, sig_fig)
  a,b = ret_string.split("e")
  b = int(b)             #removed leading "+" and strips leading zeros too.
  b = str(b)
  expr = a + "x10"**b    #Here's my problem
  pp(expr)               # default
  pp(expr, use_unicode=True)
  return latex(expr)
print(latex(sci_notation(0.001234, sig_fig=2)))

This returns: TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'

Answer

Here's a simple solution:

def SuperScriptinate(number):
  return number.replace('0','⁰').replace('1','¹').replace('2','²').replace('3','³').replace('4','⁴').replace('5','⁵').replace('6','⁶').replace('7','⁷').replace('8','⁸').replace('9','⁹').replace('-','⁻')
def sci_notation(number, sig_fig=2):
    ret_string = "{0:.{1:d}e}".format(number, sig_fig)
    a,b = ret_string.split("e")
    b = int(b)         # removed leading "+" and strips leading zeros too.
    return a + "x10^" + SuperScriptinate(str(b))