【问题标题】:String formatting with "{0:d}".format gives Unknown format code 'd' for object of type 'float'带有“{0:d}”的字符串格式。格式为“浮点”类型的对象提供未知格式代码“d”
【发布时间】:2021-04-01 21:37:53
【问题描述】:

如果我正确理解了文档,在 python 2.6.5 中,字符串格式化“{0:d}”将与“%d”一样使用 String.format() 格式化字符串

" I have {0:d} dollars on me ".format(100.113)

应该打印“我身上有 100 美元”

但是我得到了错误:

ValueError:未知格式代码“d” 对于“float”类型的对象

其他格式操作确实有效。例如。

>>> "{0:e}".format(112121.2111)
'1.121212e+05'

【问题讨论】:

    标签: python string-formatting


    【解决方案1】:

    该错误表示您将浮点数传递给格式代码,需要一个整数。 请改用{0:f}。因此:

    "I have {0:f} dollars on me".format(100.113)
    

    将给予:

    'I have 100.113000 dollars on me'
    

    【讨论】:

    • 感谢您的修复,但这似乎是一个怪癖。 %d 会做正确的事,给我 100 的浮点数 100.111,但 :d 不会。
    • 对不起贾斯汀,我的意思是这是一个以 python 为中心的怪癖
    • "%d" % 100.1 为我生成100 没有错误。字符串格式化的新方法在这方面有所不同,但我认为我更喜欢它不会为您隐式转换数据。至少如果您看到"{0:.0f}",强制舍入是显而易见的。
    • @Hugh 只是没有仔细阅读:P,我受过 Java 训练的大脑假设 String.format() 意味着 Java,但显然不是这样。我删除了无用的评论。
    • @DaveWebb 不适合精确舍入。 "{:.0f}"%d 不同,例如。 assert "{:.0f}".format(1.6) == "%d"%1.6 会提高。
    【解决方案2】:

    是的,你理解正确。但是,您传递的是float(即100.113),而不是int。将其转换为 int: int(100.113) 或直接传递 100

    【讨论】:

    • 这比"{:.0f}" 效果更好,因为int() 'rounds' 像%d.0f 没有。例如。 assert "{:.0f}".format(1.6) == "%d"%1.6 会提高,"{:d}".format(int(1.6)) == "%d"%1.6 不会。但是,如果您需要事先传递格式字符串,例如。到格式化程序并且无法控制其来源,而不是您无法执行int()。 (好吧,他们要么做 % 要么 .format 反正)
    【解决方案3】:

    使用format() 或f-string(格式化字符串)时,不会自动将float 转换为int。所以假设预期的输出是:

    I have 100 dollars on me
    

    要使用的正确格式规范是 :.0f,表示浮点数为 0 位小数,这将为您向上/向下舍入数字:

    "I have {0:.0f} dollars on me".format(100.113)
    

    显示四舍五入的一些示例:

    a = 13.1
    b = 13.9
    f'{a:.0f}' # 13
    f'{b:.0f}' # 14
    '{0:.0f}'.format(a) # 13
    '{0:.0f}'.format(b) # 14
    '{:.0f}'.format(a) # 13
    '{:.0f}'.format(b) # 14
    

    【讨论】:

      【解决方案4】:

      删除'd',因为对象类型可能不像我的情况那样是数字

      【讨论】:

      • 虽然洪鼎有点不对,但考虑到这是SO上唯一与错误消息Unknown format code 'd' for object of type 'XXX'相关的问题,值得一提的是,如果您将使用{}而不是{d} 您不必猜测出了什么问题,并且能够看到幕后发生的事情。 (我想这就是他提供“错误”答案的原因:因为错误消息是一样的。)
      猜你喜欢
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多