【问题标题】:How to format a string using variables instead of numbers within curly braces?如何使用变量而不是花括号中的数字来格式化字符串?
【发布时间】:2020-01-03 05:47:13
【问题描述】:

我使用的是 Python 3.7,并且我在变量中存储了一个值。此变量保存我想在花括号中用于字符串格式的填充值。该代码解释了我想要做什么。

def print_formatted(number):
    for i in range(1, number + 1):
        binum = bin(i).replace('0b', '')
        ocnum = oct(i).replace('0o', '')
        hexnum = hex(i).replace('0x', '')

        length = len(bin(number).replace('0b', ''))
        print('{0:>length} {1:>length} {2:>length} {3:>length}'.format(i, ocnum, hexnum, binum)) # Error here

这是我一直在尝试运行的代码。我要做的是通过用最后一个二进制数的长度值填充数字来右对齐数字。

ValueError:格式说明符无效

这是我得到的错误。我做错了什么?

【问题讨论】:

    标签: python python-3.x string-formatting


    【解决方案1】:

    您可以使用 f 字符串和格式说明符来避免使用 hexoctbin 内置函数,然后进行字符串切片并使用 int.bit_length() 而不是获取二进制字符串的长度,例如:

    def print_formatted(number):
        # get number of bits required to store number
        w = number.bit_length()
        for n in range(1, number + 1):
            # print each number as decimal, then octal, then hex, then binary with padding
            print(f'{n:>{w}} {n:>{w}o} {n:>{w}x} {n:>{w}b}')
    

    运行print_formatted(20)会给你:

        1     1     1     1
        2     2     2    10
        3     3     3    11
        4     4     4   100
        5     5     5   101
        6     6     6   110
        7     7     7   111
        8    10     8  1000
        9    11     9  1001
       10    12     a  1010
       11    13     b  1011
       12    14     c  1100
       13    15     d  1101
       14    16     e  1110
       15    17     f  1111
       16    20    10 10000
       17    21    11 10001
       18    22    12 10010
       19    23    13 10011
       20    24    14 10100
    

    【讨论】:

      【解决方案2】:

      您必须首先将变量length 的值合并到格式字符串中,奇怪的是,使用.format() 是最好的方法。

      更改以下行

      print('{0:>length} {1:>length} {2:>length} {3:>length}'.format(i, ocnum, hexnum, binum))
      

      print('{{0:>{length}}} {{1:>{length}}} {{2:>{length}}} {{3:>{length}}}'.format(length=length).format(i, ocnum, hexnum, binum))
      

      【讨论】:

        【解决方案3】:

        您可以使用f-strings

        def print_formatted(number):
            length = len(bin(number)) - 2
            for i in range(1, number + 1):
                ocnum = oct(i)[2:]
                hexnum = hex(i)[2:]
                binum = bin(i)[2:]
                print(' '.join(f'{n:>{length}}' for n in (i, ocnum, hexnum, binum)))
        
        >>> print_formatted(20)
            1     1     1     1
            2     2     2    10
            3     3     3    11
            4     4     4   100
            5     5     5   101
            6     6     6   110
            7     7     7   111
            8    10     8  1000
            9    11     9  1001
           10    12     a  1010
           11    13     b  1011
           12    14     c  1100
           13    15     d  1101
           14    16     e  1110
           15    17     f  1111
           16    20    10 10000
           17    21    11 10001
           18    22    12 10010
           19    23    13 10011
           20    24    14 10100
        

        【讨论】:

          【解决方案4】:

          我通常分两步完成,首先创建一个格式字符串。它通过转义需要保留在格式字符串中的大括号 - {{,}} 来工作。

          >>> length = 4
          >>> f'{{:>{length}}} {{:>{length}}} {{:>{length}}} {{:>{length}}}'
          '{:>4} {:>4} {:>4} {:>4}'
          >>> 
          
          
          fmt = f'{{:>{length}}} {{:>{length}}} {{:>{length}}} {{:>{length}}}'
          print(fmt.format(i, ocnum, hexnum, binum))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-09-28
            • 2011-03-06
            • 1970-01-01
            • 1970-01-01
            • 2023-03-30
            • 1970-01-01
            • 2011-08-29
            相关资源
            最近更新 更多