繁体   English   中英

格式值,可以是python 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 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

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()

也许这样的事情

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM