我可以用我心爱的%格式化程序实现可变填充字符和可变宽度吗?

时间:2014-05-05 16:35:01

标签: python

我可能在这里约会自己,但是在C格式的%formatter中长大了,从来没有真正学过C ++中新的iostream东西。由于python有%运算符,我从不费心去学习格式运算符的强大功能。然而,似乎我可能已经与我心爱的%格式化器打了一堵砖墙。

我想用变量字符(不是零字符)和可变宽度“zeropad”一个数字。看起来格式化方法处理得非常好:

width = 10
base = 'd'
fill = '1'
{0:{fill}>{width}{base}}'.format(43, base=base,fill=fill, width=width)

我无法弄清楚如何使用%formatter来实现这一点!救命!

'%013d'%(43) #works, but will not "work" for %513d where 5 should be the pad character
'%0*d'%(13,43) #as does this, but
'%a13d'%(43) #does not fill with a

我知道有一些解决方法可以达到这个目的,但是有一些非常简单的东西我不知道吗?

4 个答案:

答案 0 :(得分:1)

您不能对旧的%字符串格式化程序句号使用任意填充字符。格式支持使用*字符指定变量宽度,这就是它。

填充可以用空格或零来完成,没有别的。如果您想填写其他内容,则必须使用str.rjust()str.ljust()str.center()方法,这是一项繁琐的任务。

您可以分两步生成格式化程序:

format = '%%%(flag)s%(width)s%(base)s' % dict(base=base, flag=flag, width=width)

前提是fill为空字符串,或'-''0''#''+'' '在格式化标记之间切换; '0'是零填充选项。

然后第二步使用其输出格式化:

format % (43)

新的str.format()在内部使用多个传递,允许您更轻松地将参数插入到占位符中,支持更多格式,填充和其他功能。

答案 1 :(得分:1)

你遗失的%运算符没有神奇的技巧,但你可以用str.ljust and str.rjust

做你想做的事。
>>> # Pad the number 15 with zeros, up to 10 positions.
>>> ("%d" % 15).rjust(10, "0")
'0000000015'

答案 2 :(得分:0)

您没有遗漏任何内容,只有少数转换标记字符可用,如此处所述:https://docs.python.org/2/library/stdtypes.html#string-formatting

即:

  • '#'值转换将使用“备用表单”(如下所示)。
  • '0'对于数值,转换将为零填充。
  • ' - '保留转换后的值(如果同时给出,则覆盖'0'转换)。
  • ''(空格)在签名转换产生的正数(或空字符串)之前应留空。
  • '+'符号字符('+'或' - ')将在转换之前(覆盖“space”标志)。

不支持尝试在此处使用1进行填充。

答案 3 :(得分:0)

我可以告诉你,你必须格式化两次。它变得混乱:

>>> ('%%0%dd' % width) % 43
'0000000043'