python f 字符串整数,带有千位逗号和 space 填充

python f-string integer with thousands comma and space padded

因此,例如两个数字 12345678912345678,我想要逗号千位 对齐最右边的数字。

 123,456,789
  12,345,678

我有 f'{val:,}' 将逗号放在适当的位置,但这会将行与第一列中的 1 对齐。

我已经 f'{val:,____} 尝试了 _____ 中的各种组合、值和方向,但是 -- 不行。我什至尝试嵌套 f 弦(不起作用,仅供参考)

我该怎么做?

f'{val:,}'.rjust(n)怎么样?这将在前面加上空格,以便字符串的长度为 n。您只需要设置适当的 n 值。对于 12345678912345678,您可以设置 n=12(+ 2 因为有逗号)。这对你有帮助吗?

a = 123456789
b = 12345678
print(f"{a:12,d}\n{b:12,d}") 

数字是 field.By 的宽度,默认它们是右对齐的。

首先,您需要知道数字字符串的最大长度。然后你可以 right-align 他们:

numbers = [123456789, 12345678]
num_strs = [f'{num:,d}' for num in numbers]
max_len = max(len(s) for s in num_strs)
right_aligned = [f'{s:>{max_len}}' for s in num_strs]
print('\n'.join(right_aligned))

哪个应该给你:

123,456,789
 12,345,678

如果您已经知道所需的字符串宽度,您还可以这样做:

width = 11
f'{12345678:>{width},d}'
# generate random numbers with significantly different magnitudes
numbers = [random.randint(-1, 1) * math.ceil(random.random() * 10 ** random.randint(0, 10)) for _ in range(10)]

numbers  #  [0, -91526305, 0, 91, 7170, -448250288, 0, -36, 9521, 7830]

以下将快速计算位数,处理负数和零:

numnums = math.ceil(max(
    [math.log10(abs(n)) + (n < 0) if n != 0 else 1 for n in numbers]
))
fmt = f'{{:>{numnums + (numnums - 1) // 3},}}'

输出宽度不变:

In [34]: list(map(fmt.format, numbers))
Out[34]:
['            0',
 '  -91,526,305',
 '            0',
 '           91',
 '        7,170',
 ' -448,250,288',
 '            0',
 '          -36',
 '        9,521',
 '        7,830']