字符串格式 %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 未按预期执行?啥会导致以下代码不打印截断的两位数形式?的主要内容,如果未能解决你的问题,请参考以下文章