'Python: scientific notation with superscript exponent
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'
Solution 1:[1]
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))
Solution 2:[2]
I take it that your main problem is how can the caret-exponent be replaced with a superscript?
If you are using python in a Jupyter notebook, there is an easy way:
from IPython.display import display, Math, Latex
# if the number is in scientific format already
display(Math('2.14e-6'.replace('e', r'\times 10^{') + '}'))
# if it is not:
d = "%e" % (number)
# then use the above form: display(Math(d.replace('e', r'\times ...
Solution 3:[3]
The scinot package formats numbers in scientific notation
import scinot as sn
a=4.7e-8
print(scinot.format(a))
4.7 × 10??
or in a string
print('The value is {0:s}'.format(scinot.format(a)))
The value is 4.7 × 10??
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | wander95 |
Solution 3 |