Python 的 `str.zfill` 的通用版本支持任意填充?

问题描述 投票:0回答:5

str.zfill
是一个用前导零填充字符串的有用工具:

In [1]: '123'.zfill(5)
Out[1]: '00123'

但是,是否有更通用的版本可以采用任何填充字符并用它填充字符串?我正在寻找这样的东西:

In []: 'txt'.foo(' ', 5)
Out[]: '   txt'

In []: '12'.foo('#', 5)
Out[]: '###12'

有这样的功能吗?

python
5个回答
5
投票

是的,有字符串对齐方法,

ljust
rjust

>>> '12'.rjust(5, '#')
'###12'
>>> 'txt'.rjust(5, ' ')
'  txt'
>>> '12'.ljust(5, '#')
'12###'

1
投票

实现您自己的版本应该足够简单:

def xfill(string, num, filler='0'):
    if len(filler) != 1:
        raise TypeError('xfill() expected a character, but string of length %d found' %len(filler))
    return filler * max(0,  num - len(string)) + string

assert
确保填充符仅为单个有效字符。


xfill(string, num [, filler])

  1. string
    :要填充的字符串

  2. num
    :字段的总宽度(类似
    str.zfill

  3. filler
    :填充。默认为
    0
    以模仿
    str.zfill
    功能


示例:

In [321]: xfill('123', 5)
Out[321]: '00123'

In [322]: xfill('123', 5, '#')
Out[322]: '##123'

1
投票

为替代模式而不只是字符添加更多灵活性:

def filler(string, pattern, width):
    left_filler = (pattern * width)[:max(0, width - len(string))]
    return left_filler + string

>>> filler(string='some text', pattern='*.', width=15)
# Output:
# '*.*.*.some text'

>>> filler(string='some text', pattern='*.', width=14)
# Output:
# '*.*.*some text'

1
投票

如果您需要的只是简单的填充,我会选择@PM2Ring的答案,但还有另一种更通用的方法,使用

str.format
方法(Python 2.6 及以上版本)。此方法允许您通过嵌套替换字段来插入格式说明符:

'{string:{fill}>{num}}'.format(string=string, fill=fill, num=num)

如果您需要左对齐字符串,请将

>
替换为
<


0
投票

类似于 SwiftsNamesake 所写的内容,但以 f 字符串方式。

f'{[字符串]:[填充]>[数字]}'

示例:

example = 'example'
print(f'{example:0>10}')  # '000example'
© www.soinside.com 2019 - 2024. All rights reserved.