2017-04-18 72 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)