2012-11-21 84 views
5

在Python中使用格式字符串我可以使用「科學記數法」輕鬆打印數字。在Python中使用LaTeX表示法的格式編號

>> print '%g'%1e9 
1e+09 

什麼是格式化在乳膠格式數目的最簡單的方法,即,1個\ times10^{+ 09}?

+0

我不認爲'1^{+ 09}'完全是你想要的輸出,但無論如何。 – walkytalky

+0

當然,我的意思是10^{+ 09} – pafcu

回答

13

siunitx LaTeX軟件包通過允許您直接使用python float值,而無需解析生成的字符串並將其轉換爲有效的LaTeX,從而爲您解決了這個問題。

>>> print "\\num{{{0:.2g}}}".format(1e9) 
\num{1e+09} 

當乳膠文件被編譯時,上面的代碼將變成 enter image description here。正如安迪巴克利在評論中指出的那樣,siunitx可能不會接受加號(我沒有測試過),因此可能需要對結果做一個.repace("+", "")

如果使用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}' 
+0

不錯的解決方案!這是做什麼要求的,但是當爲了數學正確性而格式化時,在指數中包括+符號或前導零是不正常的(參見上面的siunitx輸出)。另外,由於'\ times'命令,使用原始(「r」)字符串是一個好主意。這些可以通過替換第一個返回來完成: parts = float_str.split(「e」); return r「{0} \ times 10^{{{}}}」。format(parts [0],int(parts [1])) (希望這是可以理解的:SO在代碼格式上沒有註釋!) – andybuckley

+0

@andybuckley感謝您的反饋!我糾正了我的答案。 –

+0

我也不確定什麼輸入siunitx處理,只是它的_output_是正常的數學格式沒有顯式加號或指數中的前導0。我上面評論中的內嵌代碼(可惜)是我可以想到的用於映射指數上的cast-to-int的最優雅的方式......也許在itertools中對於這樣的事情有些奇怪,但希望它很清楚這樣就夠了! – andybuckley

4

您可以編寫一個frexp10功能:

def frexp10(x): 
    exp = int(math.floor(math.log10(abs(x)))) 
    return x/10**exp, exp 

格式在LaTeX風格然後:

'{0}^{{{1:+03}}}'.format(*frexp10(-1.234e9))