如何在 Python 的 f 字符串中跳过十进制的尾随零?

问题描述

我想在我的 f 字符串中设置一个精度,但我不想要小数部分的尾随零。

i = 1002
print(f'{i/1000:.2f}') # 1.00 but this must be 1

i = 1009
print(f'{i/1000:.2f}') # 1.01,this is correct

一个 print 必须是 1,我的预期行为在第二个 print 中看到,它是 1.01

我尝试了 :g,但它对第一个 print 有效,但对第二个无效。

i = 1000
print(f'{i/1000:.2g}') # 1,this is correct but
i = 1009
print(f'{i/1000:.2g}') # 1,but this must be 1.01

我尝试过的一种方法f'{i/1000:.2f}'.strip('.0'),但我想知道是否有更好的方法

编辑:

在我的实际代码中,如果 i100000,那么分母也将是 100000(i 顺序中的最小数字),换句话说,我的代码中的分母将始终是这样 i// 分母将始终产生一个数字。

解决方法

如果您的字符串只有浮点数,那么您可以使用 str.rstrip()而不是您现在拥有的 str.strip())。此外,您需要首先使用 '0' 对其进行链式调用,然后使用 '.'.rstrip('0').rstrip('.') 来处理带有尾随零的整数,例如 10000

但是,如果您的字符串中可以包含其他字符,并且您只想为数字去掉 0,那么您可以使用嵌套的 f-string 作为:

>>> f"{f'{1002/1000:.2f}'.rstrip('0').rstrip('.')} number"
'1 number'

>>> f"{f'{1009/1000:.2f}'.rstrip('0').rstrip('.')} number"
'1.01 number'

>>> f"{f'{1000:.2f}'.rstrip('0').rstrip('.')} number"
'1000 number'
,

您必须使用两种不同的格式字符串和 round 来检测何时使用它们:

for i in [1002,1009]:
    print(f'{i/1000:.0f}') if round(i/1000,2) == 1.00 else print(f'{i/1000:.2f}')

产生的结果:

1
1.01

参考Format Specification Mini-Language

精度是一个十进制数,表示用 'f''F' 格式化的浮点值的小数点后应显示多少位,或浮点数的小数点前后应显示多少位用 'g''G' 格式化的值。

是使用我建议的 round 方法还是您提到的 strip 方法取决于您的喜好。如果您以代码应清晰、简洁和可维护的方式理解 Pythonic,那么我会使用 round 方法和两种格式字符串,因为它对未来的开发人员来说非常易读/易懂。