2

変数を使用してリテラル文字列補間で小数点の数を決定する方法はありますか?私は文字列補間で小数点の数を選択する

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を交換する簡単な方法を考えることはできません。

+0

私はこの作業を見ることができる唯一の方法は、正規表現を使用しています。 – Adriano

+1

文字列補間 'f" ... "がなければ、' '{:。{} f} ''の書式(some_float、decimals)'を使うことができます。 'f" {height:。{小数点} f} "'(私は現在3.6を持っていません) –

+0

@tobias_k私はそれを知らなかったので、 'f" { some_float:。{decimal} f} "うまく動作します。おそらくそれをアスワーとして追加しますか? – Dan

答えて

3

フォーマット指定子はネストできます。 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' 
+0

LOL ...そして、48秒以内に回答がどのようにマークされ、受け入れられるかについての最後のコメントによってMODが削除されました!! :D – NoobEditor

+0

@NoobEditorこれを防ぐためにガードが必要なのかどうかわからないけど、私はPython 3.6を実行していなかったのでコメントで解決策を提案しました。 –

+0

悪い精神の仲間では何も、私のコメントは軽いhearted.Withちょうどそれを削除する人を見て驚いていた! :) – NoobEditor

2

はい、あなたは二重の中括弧と文字列のテンプレートリテラルをエスケープすることができます

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

私はあなたが第2の置換のためformatted string literalsを使用することができるとは思わないが、私はそれがとにかく素敵な解決策だと思います。

質問の最初のコード例で間違いを犯したと思いますが、ドットはフォーマッタの間違った場所にあります。 (.3fの代わりに3.f

+0

@tobias_kあなたが正しいです、それも働く、あなたの提案された解決策は私の意見では良いです。誰かが実際にフォーマッタを組み立てたいと思っているときには、別のユースケースに対応できるので、私はまだ答えを残しています。 – fodma1

+0

はい、間違いでした。私はそれを修正しました。 3.6.1 | Anaconda custom(64-bit)|(デフォルト、5月11日2017、13:25: 'f '{height:。{decimals} f} 24)[MSC v.1900 64 bit(AMD64)] ') – Dan

関連する問題