2012-11-21 15 views
5

Pythonでフォーマット文字列を使用すると、 "scientific notation"で数字を簡単に印刷できます。PythonでLaTeX表記を使用したフォーマット番号

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

LaTeX形式で番号を1 \ times10^{+ 09}にフォーマットする最も簡単な方法は何ですか?

+0

私は '1^{+ 09}'はあなたが望む出力ではないと思いますが、とにかく思っています。 – walkytalky

+0

もちろん、私は10^{+ 09} – pafcu

答えて

13

siunitx LaTeXパッケージは、結果の文字列を解析して有効なLaTeXに変換せずに、python float値を直接使用できるようにすることで、これを解決します。

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

LaTeX文書がコンパイルされると、上記のコードは enter image description hereに変換されます。 andybuckleyがコメントで指摘したように、プラス記号は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 ")文字列を使用することをお勧めします。これらは、最初の戻り値を次のように置き換えることによって行うことができます。 part = float_str.split( "e"); 返信r "{0} \ times 10^{{{1}}"。 (期待通りです:コメントにはコードフォーマットがありません!) – andybuckley

+0

@andybuckleyフィードバックありがとう!私は私の答えを訂正しました。 –

+0

私はまた、siunitxがどのような入力を処理するのかよく分かりません。その_output_は、明示的なプラス記号も指数部の先頭の0もない通常の数学形式です。上のコメントのインラインコードの私のビットは、(悲しいことに)私が指数にキャスト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)) 
関連する問題