[英]How to skip trailing zeroes from decimal in Python's f-strings?
我想在我的 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')
但我想知道是否有更好的方法。
编辑:
在我的实际代码中,如果i
是100000
,那么分母也将是 100000(按i
顺序排列的最小数字),换句话说,我的代码中的分母将始终使 i//分母始终产生一个数字。
如果你的字符串只有浮点数,那么你可以使用str.rstrip()
(而str.strip()
你现在拥有的 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
请参阅格式规范迷你语言
精度是一个十进制数,表示使用
'f'
和'F'
格式化的浮点值的小数点后应显示多少位,或使用'g'
或格式化的浮点值的小数点前后显示多少位'G'
。
取决于您的口味是使用我建议的round
方法还是您提到的strip
方法。 如果您以代码应该清晰、简洁和可维护的方式来理解 Pythonic,那么我会使用带有两个格式字符串的round
方法,因为它对于未来的开发人员来说非常可读/易于理解。
当不提供格式说明符时,格式化程序似乎会自动简化。 因此,如果在要求自动格式化之前对值进行四舍五入,它会更接近所需的结果。 这不完全符合您的要求,但比其他答案更简单。 (我找到了解决这个问题的方法来寻找这种行为)。
i = 1002
print(f'{round(i/1000, 2)}') # 1.0
i = 1009
print(f'{round(i/1000, 2)}') # 1.01
证明:
>>> i = 1002
>>> f'{round(i/1000,2)}'
'1.0'
>>> i = 1009
>>> f'{round(i/1000,2)}'
'1.01'
我们可以通过利用您的原始想法/其他人的答案来得到您真正想要的(只需要提供整数情况):
i = 1002
print(f'{round(i/1000, 2)}'.rstrip('.0')) # 1
i = 1009
print(f'{round(i/1000, 2)}'.rstrip('.0')) # 1.01
证明:
>>> i = 1002
>>> f'{round(i/1000, 2)}'.rstrip('.0')
'1'
>>> i = 1009
>>> f'{round(i/1000, 2)}'.rstrip('.0')
'1.01'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.