2014-06-05 26 views
1

我試圖完成大多數Python的方式來墊離開了小數點的浮動

-12.345 -> -012.345 

凡離開小數點可以-999-> 999(我的特殊需要)和正量十進制數字

我想出了兩種方法來做到這一點:

​​

但這似乎非常無厘頭的是蟒蛇。我看到了以前類似的問題,但不喜歡的答案...

>>> "%06.2f"%3.3 
'003.30' 

,因爲它假設你已經知道你的小數點是和你有多少個十進制數字都有。

這似乎是一個常見的情況,那麼有一個現有的更好/清潔/單fncall,方式去這在Python 2.7?

+0

相信['''str.format()' ''](https://docs.python.org/2/library/string.html#formatspec)是你想要的 – wnnmaw

+0

http://stackoverflow.com/questions/17118071/python-add-leading-zeroes-using-str-format看起來像它很好地與整數工作,但不漂浮,因爲我的寬度是可變的取決於小數位數量,所以從我可以告訴,我仍然需要計算我有十進制數字:\ – pyInTheSky

+2

@pyInTheSky:你是什麼意思*小數位數量*?花車*近似值*,總是最終舍入*無論如何*。例如,「-12.345」不是正好*'-12.345'。 '格式(-12.345,'.53f')'>''-12.34500000000000063948846218409016728401184082031250000''。 –

回答

1

不知道這是pythonic。它只是填充整數和concat小數。

def pad(x, p): 
    return ('%0'+str(p+(x<0 and 1 or 0))+'d%s') % (x,str(x-int(x))[x<0 and 2 or 1:]) 

測試

pad(-3,3) -> -003 
pad(3,3) -> 003 
pad(-3.3,3) -> -003.3 
pad(3.3,3) -> 003.3 
+0

@steveha,這很棘手。感謝他們的接觸 – Fabricator

+0

這是一個令人失望的地方,它似乎並不是一個漂亮的建築,但是b.a.尋找一些瘋狂的拼接邏輯。我不知道這可以做到。 – pyInTheSky

2

我想你已經找了個角落的情況。指定小數點左側和右側的數字很容易;指定總位數也很容易;指定左側的數字並且完全不指定右側的數字並不容易。

我建議做最乾淨的事情是隻取浮子和格式,再取餾分和格式化(未指定的長度)的整數部分。

這裏是一個測試功能確實你要的那種東西,也可以正確處理負數。

import math 

def float_lformat(f, width): 
    neg = f < 0.0 
    fraction, n = math.modf(abs(f)) # get fraction and integer parts of f 
    if neg and width > 0: 
     width -= 1 
    s = "%0*d" % (width, n) + str(fraction)[1:] 
    if neg: 
     s = '-' + s 
    return s 
+0

是的,我正在參加NMEA拉特。值已經從str轉換爲float(失去它對於lats <100的前導0),然後將其格式化,所以不是顯示數字的最常見方法。 – pyInTheSky

0

固定和動態分數:

>>> "{:08}".format(-12.345) 
'-012.345' 

>>> a,b=str(x).split('.');a=int(a);"{}{:03}.{}".format('-' if a<0 else"",abs(a),b) 
'-012.345' 

整理了:

def pad(x): 
    a, b = str(x).split('.') 
    a = int(a) 
    return '{}{:03}.{}'.format('-' if a < 0 else ' ', abs(a), b) 

for x in [12.0, 12.345, -12.345, -12.3456]: 
    print('{:>8} -> {}'.format(x, pad(x))) 

輸出:

12.0 -> 012.0 
    12.345 -> 012.345 
-12.345 -> -012.345 
-12.3456 -> -012.3456 
相關問題