使用Python中的格式化字符串,我可以轻松地将一个数字打印为“科学计数法”,例如:
>> print '%g'%1e9
1e+09
如何在LaTeX格式中以最简单的方式格式化数字,例如1\times10^{+09}?
使用Python中的格式化字符串,我可以轻松地将一个数字打印为“科学计数法”,例如:
>> print '%g'%1e9
1e+09
如何在LaTeX格式中以最简单的方式格式化数字,例如1\times10^{+09}?
使用siunitx LaTeX 包可以帮助您解决此问题,它允许您直接使用Python浮点数值,而无需解析结果字符串并将其转换为有效的LaTeX。
>>> print "\\num{{{0:.2g}}}".format(1e9)
\num{1e+09}
当LaTeX文档编译时,以上代码将转换为。正如andybuckley在评论中指出的那样,加号可能不会被siunitx接受(我没有测试过),因此可能需要对结果进行
.replace("+", "")
操作。
如果无法使用siunitx
,可以编写一个自定义函数,如下所示:
def latex_float(f):
float_str = "{0:.2g}".format(f)
if "e" in float_str:
base, exponent = float_str.split("e")
return r"{0} \times 10^{{{1}}}".format(base, int(exponent))
else:
return float_str
测试:
>>> latex_float(1e9)
'1 \\times 10^{9}'
\times
命令,最好使用原始(“r”)字符串。可以通过将第一个返回替换为以下内容来完成:
parts = float_str.split("e");
return r"{0} \times 10^{{{1}}}".format(parts[0], int(parts[1]))
(希望这是可以理解的:SO在注释中不会进行代码格式化!) - andybuckleylatex_float(1.234e9)
会发生什么?或者我漏掉了一些明显的东西吗?!显然,幂为整数的尾数对于1e9这个特定情况有效 :-) - andybuckleyfrexp10
函数:def frexp10(x):
exp = int(math.floor(math.log10(abs(x))))
return x / 10**exp, exp
LaTeX样式中的格式化如下:
'{0}^{{{1:+03}}}'.format(*frexp10(-1.234e9))
pip install num2tex
并将其用作以下方式:
>>> from num2tex import num2tex
>>> '{:.0e}'.format(num2tex(1e9))
'1 \\times 10^{9}'
num2tex
继承自 str
,因此可以以相同的方式使用 format
函数。
您还可以通过使用 num2tex.configure()
更改指数的格式(针对 @Matt 的评论添加此内容)。
>>>from num2tex import num2tex
>>>from num2tex import configure as num2tex_configure
>>>num2tex_configure(exp_format='cdot')
>>>num2tex(1.3489e17)
'1.3489 \cdot 10^{17}'
>>>num2tex_configure(exp_format='parentheses')
'1.3489 (10^{17})'
截至目前,这在GitHub上还没有文档记录,我将尽快更改!
免责声明:使用Lauritz V. Thaulow的答案一段时间后(用于Jupyter、Matplotlib等),我觉得编写一个简单的Python模块(num2tex)会对我的工作流程更好,因此我在GitHub上创建了它,并在PyPI上注册。我很想听取如何使其更有用的反馈意见。
num2tex(100000,precision=1)
将输出$\times 10^5$,省略了“1”。当精度$\leq n+1$时,对于任何$10^n$都会发生这种情况(但如果$a\neq 1$,则不适用于$a.10^n$)。 - Matt
1^{+09}
不是你想要的输出,但无论如何。 - walkytalky