2012-11-21 40 views
5

Sử dụng chuỗi định dạng bằng Python Tôi có thể dễ dàng in một số trong "ký pháp khoa học", ví dụ:Số định dạng sử dụng ký hiệu LaTeX trong Python

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

Cách đơn giản nhất để định dạng số ở định dạng LaTeX, tức là 1 \ times10^{+ 09} là gì?

+0

Tôi không nghĩ '1^{+ 09}' là kết quả đầu ra bạn muốn, nhưng dù sao đi nữa. – walkytalky

+0

Đúng, tất nhiên tôi có nghĩa là 10^{+ 09} – pafcu

Trả lời

13

siunitx Gói LaTeX giải quyết điều này cho bạn bằng cách cho phép bạn sử dụng trực tiếp giá trị phẩy python mà không cần phải phân tích chuỗi kết quả và biến nó thành LaTeX hợp lệ.

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

Khi tài liệu LaTeX được biên dịch, các mã trên sẽ được biến thành enter image description here. Như andybuckley chỉ ra trong các ý kiến, dấu cộng có thể không được chấp nhận bởi siunitx (tôi đã không thử nghiệm nó), do đó, nó có thể là cần thiết để làm một kết quả .repace("+", "").

Nếu sử dụng siunitx là bằng cách nào đó khỏi bàn, viết một chức năng tùy chỉnh như thế này:

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 

Thử nghiệm:

>>> latex_float(1e9) 
'1 \\times 10^{9}' 
+0

Giải pháp tuyệt vời! Điều này làm những gì được yêu cầu, tuy nhiên nó không phải là bình thường để bao gồm một dấu + hoặc số 0 đứng đầu trong số mũ khi định dạng cho tính chính xác toán học (xem đầu ra siunitx ở trên). Ngoài ra, do lệnh '\ times' nên sử dụng chuỗi thô (" r "). Chúng có thể được thực hiện bằng cách thay thế lợi tức đầu tiên bằng: các phần = float_str.split ("e"); trả về r "{0} \ lần 10^{{{1}}}" định dạng (các phần [0], int (các phần [1])) (Hy vọng điều đó dễ hiểu: SO không định dạng mã trong các nhận xét !) – andybuckley

+0

@andybuckley Cảm ơn bạn đã phản hồi! Tôi đã sửa chữa câu trả lời của mình. –

+0

Tôi cũng không chắc chắn xử lý siunitx đầu vào nào, chỉ _output_ của nó ở định dạng toán học bình thường mà không có dấu cộng rõ ràng hoặc số 0 đứng đầu trong số mũ. Bit của tôi trong mã nội tuyến trong các bình luận ở trên là (đáng buồn) cách thanh lịch nhất mà tôi có thể nghĩ đến bản đồ một cast-to-int trên số mũ ... có thể có cái gì đó funky trong itertools cho những thứ như vậy nhưng hy vọng nó rõ ràng đủ theo cách này! – andybuckley

4

Bạn có thể viết một hàm frexp10:

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

Định dạng theo kiểu LaTeX là:

'{0}^{{{1:+03}}}'.format(*frexp10(-1.234e9)) 
Các vấn đề liên quan