【问题标题】:Python string formatting - old `%` vs new `str.format`Python 字符串格式化 - 旧的 `%` 与新的 `str.format`
【发布时间】:2015-11-09 10:22:07
【问题描述】:

新格式让我们可以这样做:'{:.<12}'.format('##') - 可选填充字符。
我们可以使用旧格式来做到这一点吗?
(我知道我们可以用空格填充'%-12s' % '##'

此外,旧格式允许我们这样做:'%-*s' % (12, '##') - 可变长度。
我们可以使用新格式来做到这一点吗?

【问题讨论】:

    标签: python string python-2.7 string-formatting


    【解决方案1】:

    对于使用 new-format 进行可变长度,您可以使用替换嵌套 -

    >>> '{:{}<{}}'.format('##','.',12)
    '##..........'
    >>> '{:{}<{}}'.format('##','-',12)
    '##----------'
    >>> '{:{}<{}}'.format('##','-',20)
    '##------------------'
    

    偶数空格作为填充字符 -

    >>> '{:{}<{}}'.format('##',' ',20)
    '##                  '
    

    请注意,您并不总是需要使用嵌套替换,您也可以直接以格式指定它们 -

    >>> '{: <12}'.format('##')
    '##          '
    

    您还可以指定每个参数的位置来决定哪个参数放在哪里。示例 -

    >>> '{2:{0}<{1}}'.format('.',12,'##')
    '##..........'
    >>> '{0:{1}<{2}}'.format('##','-',20)
    '##------------------'
    

    【讨论】:

    • 嗯,想听听我的回答有什么问题。
    【解决方案2】:

    使用format,您可以嵌套替换:

    '{:.<{}}'.format('##',12)
    

    所以format 更强大。 % 不能使用可选的填充字符。

    【讨论】:

      【解决方案3】:

      对于问题的第一部分,您可以左对齐并使用 12 宽度的空格作为填充字符:

      '%-*s' % (12, '##') 可以替换为'{: &lt;12}'.format('##')

      对于第二部分,您不能使用旧样式格式指定填充字符。

      有一个不错的网站here 展示了您可以和不能对旧与新做的大部分事情,一个涵盖填充和对齐字符串的 sn-p:

      填充和对齐字符串

      默认情况下,值的格式设置为只占用表示内容所需的字符数。然而,也可以定义一个值应该被填充到一个特定的长度。

      不幸的是,新旧样式格式的默认对齐方式不同。旧样式默认为右对齐,而新样式默认为左对齐。

      Align right:
      
      Old '%10s' % ('test',) 
      New '{:>10}'.format('test')
      
      Align left:
      
      Old
      
      '%-10s' % ('test',)
      New
      
      '{:10}'.format('test')
      

      论据:

      在前面的示例中,值“10”被编码为格式字符串的一部分。但是,也可以提供这些值作为参数。

      Old
      
      '%*s' % ((- 8), 'test')
      New
      
      '{:<{}s}'.format('test', 8)
      

      同样,新样式格式通过提供对值如何填充和对齐的更多控制来超越旧变体。 您可以选择填充字符:

      此操作不适用于旧式格式。

      New
      
      '{:_<10}'.format('test')
      Output
      

      还有居中对齐值:

      此操作不适用于旧式格式。

      New
      
      '{:^10}'.format('test')
      

      【讨论】:

      • 第一部分的想法是可变长度。嵌套格式解决了这个问题。感谢pyformat 链接!
      • 没有问题,然后嵌套{} 将完成工作'{: &lt;{}}'.format('##',var)'{: &lt;{var}}'.format('##,var=var')
      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 2018-07-08
      • 2012-09-01
      • 2019-11-28
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      相关资源
      最近更新 更多