2017-04-18 71 views
9

有一種簡潔的方式來格式化一個數字,有時也可以是一個字符串?格式值可能是數字和/或字符串python 3

該數字通常是一個浮點數,但偶爾也會將其表示爲字符串「n/a」。

我想用固定數量的小數格式化浮點數,但打印整個字符串以防它不是數字。

例如:

var=3.145623 
print("This is {0:.2f}".format(var)) 

>>>This is 3.14 

,但

var = "n/a" 
print("This is {0:.2f}".format(var)) 

>>> File "<stdin>", line 1, in <module> 
>>> ValueError: Unknown format code 'f' for object of type 'str' 

我不由ValueError異常驚訝,但不知道是否在它周圍有一個簡潔的方式,非常不明確的if語句。

+0

這似乎是使用一個明確的'如果-else'是最直接的方法......這是當你處理你的問題混合類型,以及爲什麼你應該儘可能避免它。 –

+0

@ juanpa.arrivillaga:我只是錯過了.format()或其他東西的開關 - 對我來說,這似乎是一個問題,人們可能會頻繁地遇到問題,因此可能有內置的東西。 – Gerhard

+0

請問,爲什麼你有可能得到'float'或'n/a'字符串?看來這是真正的問題。 –

回答

4

Python支持非數字作爲float('nan'),它可能比您的代碼中的字符串「n/a」更有用。它適用於格式化,如果在計算中使用它,則會產生比字符串更理性的結果。

楠:

>>> n = float('nan') 
>>> n 
nan 
>>> "{0:.2f}".format(n) 
'nan' 
>>> n == 3 
False 
>>> n * 2 
nan 
>>> n < 5 
False 

字符串:

>>> n = 'n/a' 
>>> "{0:.2f}".format(n) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: Unknown format code 'f' for object of type 'str' 
>>> n == 3 
False 
>>> n * 2 
'n/an/a' 
>>> n < 5 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unorderable types: str() < int() 
+0

這就是我最後使用的結果 - 將「n/a」值轉換爲「nan」。 – Gerhard

6

的確,f格式說明符僅適用於實際的float值。您無法避免必須特別處理您的n/a值。

可以格式化浮動分別,並有條件地,然後將結果插值到更大的模板:

var_formatted = format(var, '.2f') if var != 'n/a' else var 
print("This is {0:4}".format(var_formatted)) 

如果你真的不願意if,您可以使用異常處理太:

try: 
    var_formatted = format(var, '.2f') 
except ValueError: 
    var_formatted = 'n/a' 
print("This is {0:4}".format(var_formatted)) 

另一種選擇是你可以用__format__方法將值包裝在類中:

class OptionalFloat(object): 
    def __init__(self, value): 
     self.value = value 
    def __format__(self, fmt): 
     try: 
      return self.value.__format__(fmt) 
     except ValueError: 
      return self.value 

print("This is {0:.2f}".format(OptionalFloat(var))) 

這會將要求檢測的類型到另一個類的方法,讓你的輸出代碼的所有那些討厭的條件語句或異常處理程序少許清潔劑和​​自由:

>>> var = 3.145623 
>>> print("This is {0:.2f}".format(OptionalFloat(var))) 
This is 3.15 
>>> var = 'n/a' 
>>> print("This is {0:.2f}".format(OptionalFloat(var))) 
This is n/a 
1

也許這樣的事情

str = "{0:.2f}".format(var) if isinstance(var, float) else var 
print(str)