字符串格式 %02d 未按预期执行?啥会导致以下代码不打印截断的两位数形式?

Posted

技术标签:

【中文标题】字符串格式 %02d 未按预期执行?啥会导致以下代码不打印截断的两位数形式?【英文标题】:String formatting %02d not performing as expected? What would cause the following code to not print truncated two-digit form?字符串格式 %02d 未按预期执行?什么会导致以下代码不打印截断的两位数形式? 【发布时间】:2012-05-14 19:40:47 【问题描述】:

不知道为什么会这样。我一定遗漏了一些明显的东西。

我正在尝试让计数器打印出类似 SMPTE 代码(小时:分钟:秒:帧(假设 24fps))之类的东西。

到目前为止的代码:

import time


s_time = time.time()
def format_time():
    t = time.time() - s_time 
    if t < 1:
        print '00:00:00:%02d' % int(t/0.041666666666666664)
    elif t < 60:
        t = str(t).split('.')

        print '00:00:%02d:%02d' % (int(t[0]), int(int(t[1][:4])/0.041666666666666664) )

while True:
    format_time()

最初一切似乎都很好,直到持续时间超过 1 秒并进入 elif 分支。秒打印出来很好,但帧打印出完整的多位数计算结果。鉴于格式化运算符指定%02d,就像它在第一个if 分支中所做的那样(其行为符合预期),为什么它在第二个分支中不服从?我不知道为什么它仍在打印完整的结果而不是截断的版本。

【问题讨论】:

我想你想要一个% 60% 100 在那里的某个地方。 (% 作为模运算符。试试print '00:00:%02d:%02d' % (int(t[0]), int(int(t[1][:4])/0.041666666666666664) % 100 ) 为什么不用t/0.041666666666666664,而不是t * 24.0?更简单,更容易编写,并且数字的来源(每秒帧数)更加明显。 @Karl Knechtel - 我不是个聪明人。 【参考方案1】:

您正在尝试获取浮点数的整数部分和小数部分来打印结果。直接在数字数据上使用运算符和函数是一种很好的做法,而不是通过将浮点数转换为 str 再转换回数字来增加大量开销。

为此使用数学模块 modf 函数。它还将简化您的算法。

import time
import math

s_time = time.time()
def format_time():
    t = time.time() - s_time
    if t < 60:
        f,i = math.modf(t)
        print '00:00:%02d:%02d' % (i, f/0.041666666666666664)

while True:
    format_time()

PS:对于您的代码错误,在您的 elif 块中,您将 t 作为具有巨大值的整数传递,而不是传递它的 0.xxxxx 值。如果您继续使用浮点数的数学函数,则不会出现此错误。

【讨论】:

【参考方案2】:

我希望你想要这样的东西:

hours = int(t)/3600
minutes = (int(t)/60)%60
seconds = int(t)%60
frames = (t-int(t))*24
print '%02d:%02d:%02d:%02d' % (hours, minutes, seconds, frames)

【讨论】:

这实际上效果很好!它比我创建的这个多重 if/else 怪物要简单得多。谢谢!【参考方案3】:

%02d 表示:打印整数,如果小于 2 位,则在其前面加上零。 它不会将格式化字符串限制为两位数。

编辑:获取数字n 的前 2 位(四舍五入)数字的一种方法是:

n = 13900
print round(n/10**math.floor(math.log10(n)-1))

或者如果你不关心四舍五入,就剪掉字符串...

【讨论】:

.....哦,废话。尴尬。我完全误解了。你知道完成我想要做的事情的格式化运算符吗?

以上是关于字符串格式 %02d 未按预期执行?啥会导致以下代码不打印截断的两位数形式?的主要内容,如果未能解决你的问题,请参考以下文章

PHP is_int 未按预期执行

Mandelbrot 集函数未按预期执行

Office.FileDialog 未按预期执行

Nodejs 代码未按预期执行

带有一个 goto 标签的 C 代码未按预期工作

C++ 11 正则表达式未按预期返回组