选择字符串插值中的小数点位数

Choose the number of decimal points in string interpolation

有没有办法使用变量来决定文字字符串插值中的小数点位数?

例如,如果我有类似的东西

f'{some_float:.3f}'

有没有办法用变量替换 3

最终目标是向条形图添加数据标签:

def autolabel_bar(rects, ax, decimals=3):
    """
    Attach a text label above each bar displaying its height
    """
    for rect in rects:
        height = rect.get_height()
        ax.text(rect.get_x() + rect.get_width()/2.,
                height + 0.035,
                f'{round(height,decimals):.3f}',
                ha='center',
                va='center')

但是我想不出一个简单的方法来用变量decimal替换字符串插值中的3

是的,您可以使用双花括号转义字符串模板文字:

decimals = 5
template = f'{{some_float:{decimals}.f}}'
// '{some_float:5.f}'
template.format(some_float=some_float)

我认为您不能使用 formatted string literals 进行第二次替换,但我认为这是一个很好的解决方案。

我认为你在问题的第一个代码示例中犯了一个错误,点在你的格式化程序中的错误位置。 (3.f 而不是 .3f

格式说明符可以嵌套。在 Python 3.5 中,这看起来像像这样:

"{:.{}f}".format(some_float, decimals)

但事实证明,同样适用于 Python 3.6 f"..." 格式字符串。

>>> some_float = math.pi
>>> decimals = 3
>>> f"{some_float:.{decimals}f}"
'3.142'

也可以与 round 结合使用:

>>> decimals = 5
>>> f"{round(math.pi, decimals):.{decimals}f}"
'3.14159'