【问题标题】:python string formatting {:d} vs %d on floating point numberpython字符串格式化{:d}与浮点数上的%d
【发布时间】:2014-10-03 09:36:19
【问题描述】:

我意识到这个问题可以解释为与其他问题相似,所以在我开始之前,在大家开始指出之前,这里列出了一些可能的“重复”。这些似乎都没有真正正确地回答我的问题。

我的问题与使用 string.format() 方法显示整数有关。

在运行 python 2.7 的解释器中使用 % 字符串格式运行以下代码

    >>> print "%d" %(1.2345)  
    1

而使用string.format() 方法会导致以下结果

    >>> print "{:d}".format(1.2345)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: Unknown format code 'd' for object type 'float'

我期待两者的行为相同;让解释器在显示之前将我的浮点数实际转换为整数。我意识到我可以只使用 int 函数将浮点数转换为整数格式,但我正在寻找与 %d 格式化方法相同的功能。是否有任何string.format() 方法可以为我做到这一点?

【问题讨论】:

  • 如果您不知道您的变量是否为整数,那么不只是自己明确进行转换的原因是什么?例如print "{:d}".format(int(1.2345))
  • @Tom,正如我所说,我可以自己进行转换,我所有的麻烦都会消失。但我真正想知道的是,为什么两种乍一看非常相似的方法做的事情并不完全相同。

标签: python string string-formatting


【解决方案1】:

这两个实现是完全不同的,% 实现中的一些缺陷已被消除。将%d 用于浮点数可能会掩盖代码中的问题,即您认为自己有整数但得到了浮点值。想象一下 1.999999 的值,而 %d 只看到 1 而不是 2 会截断该值。

因此,str.format()调用的float.__format__()钩子方法进行实际转换工作不支持d格式,而是抛出异常。

您可以使用{:.0f} 格式显式显示(四舍五入)不带十进制数的浮点值:

>>> '{:.0f}'.format(1.234)
'1'
>>> '{:.0f}'.format(1.534)
'2'

或在格式化之前使用int() 明确截断您的浮点数。

附带说明,如果您所做的只是将数字格式化为字符串(而不是插入为更大的字符串),请使用format() function

>>> format(1.234, '.0f')
'1'

这可以更好地传达您的意图,并且启动速度更快。

【讨论】:

  • 谢谢,很好的解释!这就是我真正追求的。 +1
【解决方案2】:

关于“自动类型转换”(强制),2.7 和 3.0 之间有一个重要的变化。虽然 2.7 在这方面相对“放松”,但 3.0 迫使您更加自律。

自动转换可能很危险,因为它可能会默默地截断/减少一些数据!此外,这种行为是不一致的,你永远不知道会发生什么;直到你遇到他的问题。 Python 3.0 要求您明确指定您想要做什么!

然而,新的 string.format() 增加了一些非常强大和有用的格式化技术。 “免费”格式“{}”甚至非常清楚。像这样:

'{}'.format(234)
'{:10}.format(234)
'{:<10}'.format(234)

看到了吗?我不需要指定“整数”、“浮点数”或其他任何内容。这适用于任何类型的值。

for v in (234, 1.234, 'toto'):
    for fmt in ('[{}]', '[{:10}]', '[{:<10d}]', '[{:>10d}]'):
        print(fmt.format(v))

此外,% 值已过时,不应再使用。新的 string.format() 比旧的格式化技术更易于使用并且具有更多功能。恕我直言,这会降低旧技术的吸引力。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多