为啥 "%-d" 或 "%-e" 删除前导空格或零?

Posted

技术标签:

【中文标题】为啥 "%-d" 或 "%-e" 删除前导空格或零?【英文标题】:Why does "%-d", or "%-e" remove the leading space or zero?为什么 "%-d" 或 "%-e" 删除前导空格或零? 【发布时间】:2015-05-07 18:51:25 【问题描述】:

关于 SO 问题904928 (Python strftime - date without leading 0?)Ryan 回答:

实际上我遇到了同样的问题,我意识到,如果你添加一个 % 和字母之间的连字符,可以去掉前导零。

例如 %Y/%-m/%-d。

我遇到了同样的问题,这是一个很好的解决方案,但是,为什么会这样?

>>> import datetime
>>> datetime.datetime(2015, 3, 5).strftime('%d')
'05'

>>> datetime.datetime(2015, 3, 5).strftime('%-d')
'5'

# It also works with a leading space
>>> datetime.datetime(2015, 3, 5).strftime('%e')
' 5'

>>> datetime.datetime(2015, 3, 5).strftime('%-e')
'5'

# Of course other numbers doesn't get stripped
>>> datetime.datetime(2015, 3, 15).strftime('%-e')
'15'

我找不到任何相关文档? -> python datetime docs / python string operations

这似乎在 windows 机器上不起作用,好吧,我不使用 windows,但知道它为什么不起作用会很有趣?

【问题讨论】:

在我的 Windows 版本中,只有您的第一个示例可以正常工作。其余的结果为ValueError: Invalid format string。 This question 可能会在标准/便携式指令与特定于平台的“增强”方面对您有所了解。 所以这取决于每个操作系统的libc实现。谢谢!关于这些示例如何/为什么通常适用于 unix 系统的任何提示? 【参考方案1】:

Python datetime.strftime() delegates to C strftime() function that is platform-dependent:

支持的全套格式代码因平台而异, 因为 Python 调用了平台 C 库的 strftime() 函数,并且 平台变化很常见。查看完整的格式代码集 在您的平台上受支持,请参阅 strftime(3) 文档。

Glibc notes for strftime(3):

-(破折号)不要填充数字结果字符串。

我的 Ubuntu 机器上的结果:

>>> from datetime import datetime
>>> datetime.now().strftime('%d')
'07'
>>> datetime.now().strftime('%-d')
'7'

【讨论】:

如果您在 Linux 上工作,那就太好了。在 Windows 上工作时应该做什么? @NoctisSkytower 我想首先在 Windows 上不会有问题。如果它不支持时间格式的减号,那么就不会有“为什么减号删除任何东西”的问题。不支持——毫无疑问。 注意在 Windows 上使用 # 而不是 - 可能对未来的读者有所帮助。 @NoctisSkytower 如果您认为它与当前问题相关,您可以发布自己的答案。

以上是关于为啥 "%-d" 或 "%-e" 删除前导空格或零?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的电脑打开要重新连网络?

dubbo 服务启动之后自动退出,为啥?

document.getElementById在JS方法外使用为啥获取空

为啥 IsNumeric("1.23D45") 返回 True?

stm32 串口发送数组 为啥串口发送不出去我打印的四个数字

为啥 printf ("%d", ~a);当 a 等于 3 时显示 -4?