格式值可以是 python 中的数字 and/or 字符串 3
format value that could be number and/or string in 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 语句。
实际上,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 中:
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)))
这将检测类型的要求转移到另一个 class 方法中,使您的输出代码更清晰一些,并且没有所有那些讨厌的条件或异常处理程序:
>>> 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
可能是这样的
str = "{0:.2f}".format(var) if isinstance(var, float) else var
print(str)
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()
是否有一种简洁的方式来格式化数字,有时也可以是字符串?
该数字通常是一个浮点数,但有时也表示为字符串 "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 语句。
实际上,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 中:
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)))
这将检测类型的要求转移到另一个 class 方法中,使您的输出代码更清晰一些,并且没有所有那些讨厌的条件或异常处理程序:
>>> 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
可能是这样的
str = "{0:.2f}".format(var) if isinstance(var, float) else var
print(str)
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()