f-string で値を埋め込むだけなら f"{name}" で済みます。困るのは : から先です。桁を揃えたい、ゼロ埋めしたい、カンマを入れたい。そのたびにドキュメントを開き直している気がしたので、実際に使う 5 パターンに絞って手元にまとめました。
: の後ろは 書式指定ミニ言語 と呼ばれる独自の文法で、並びはこうなっています。
{値:[fill][align][sign][#][0][width][,][.precision][type]}全部覚える必要はありません。実際に手が動くのは以下の 5 つです。
1. 桁揃え
< が左寄せ、> が右寄せ、^ が中央寄せ。数字は幅です。
print(f"|{'Leão':<10}|")print(f"|{'Leão':>10}|")print(f"|{'Leão':^10}|")|Leão || Leão|| Leão |寄せ方を省略したときの既定は型によって違い、文字列は左寄せ、数値は右寄せです。
print(f"|{'Leão':10}|")print(f"|{9:10}|")|Leão || 9|寄せ方の前に文字を 1 つ置くと、空白の代わりにその文字で埋めます。
print(f"{'Leão':.<10}")print(f"{42:*^9}")Leão......***42****この埋め文字は寄せ方とセットでしか書けません。f"{42:*9}" のように寄せ方を省くと、* が埋め文字だと解釈されず ValueError: Invalid format specifier になります。.< や *^ のように必ず 2 文字で書いてください。
2. ゼロ埋め
幅の前に 0 を置くとゼロ埋めになります。
print(f"{7:03d}")print(f"{-42:05d}")print(f"{3.5:06.2f}")007-0042003.50-42 が -0042 になっているとおり、この 0 は符号を潰さずに桁だけ埋めます。前章の埋め文字は符号より外側に入る(f"{-42:.>5}" は ..-42)ので、数値として桁を揃えたいときはこちらを使います。
3. カンマ区切り
, を入れると 3 桁区切り、_ ならアンダースコア区切りになります。
print(f"{1234567:,}")print(f"{1234567:_}")1,234,5671_234_567幅・区切り・精度は同時に指定できます。並び順は幅 → 区切り → 精度です。
print(f"{1234567.891:>14,.2f}") 1,234,567.894. 小数の桁数
.2f で小数第 2 位まで。% を使うと 100 倍して % を付けてくれるので、率の表示で便利です。
print(f"{2/3:.2f}")print(f"{0.4567:.1%}")print(f"{123456:.3g}")0.6745.7%1.23e+05g は有効数字での指定で、大きすぎる/小さすぎる値は指数表記に切り替わります。
CAUTION
.2fの丸めは四捨五入ではありません。しかも直感から外れる理由が 2 つあります。print(f"{0.125:.2f}")print(f"{2.675:.2f}")0.122.67
0.125は 1/8 なので 2 進数で正確に表せます。これはちょうど半分の値なので、偶数側に寄せる規則(偶数丸め)が働いて0.12になります。一方
2.675は 2 進数で正確に表せず、内部では2.674999...を持っています。半分に届いていないので単に切り捨てられただけで、偶数丸めは関係ありません。「半分の値は偶数側」という規則だけを覚えていると、2.68を期待して外します。金額を扱ったことはまだないので受け売りです。丸め方を厳密に決めたい場面では、表示側で調整せず
decimal.Decimalで丸めてから渡すのが定石とされています。
5. 日付
datetime を渡したときの : 以降は、ここまでの書式ミニ言語ではなく strftime の書式 がそのまま使えます。
from datetime import datetime
d = datetime(2026, 8, 3, 21, 5)print(f"{d:%Y-%m-%d}")print(f"{d:%Y/%m/%d %H:%M}")print(f"{d:%m/%d(%a)}")2026-08-032026/08/03 21:0508/03(Mon)d.strftime("%Y-%m-%d") と結果は同じですが、f-string の中に直接書けるぶん読みやすくなります。オブジェクトごとに : 以降の解釈を変えられる仕組みなので、自作クラスでも __format__ を定義すれば同じことができます。
組み合わせると表になる
5 つを覚えると、ログや確認用の出力を整形するのが一気に楽になります。
rows = [("Rafael Leão", 9, 1.234), ("Christian Pulisic", 8, 0.87), ("Adrien Rabiot", 6, 12.5)]for name, goals, xg in rows: print(f"{name:<20}{goals:>3}{xg:>8.2f}")Rafael Leão 9 1.23Christian Pulisic 8 0.87Adrien Rabiot 6 12.50CAUTIONこの方法は日本語を混ぜると崩れます。
print(f"{'レオン':<10}|")print(f"{'Leão':<10}|")レオン |Leão |幅指定が数えているのは文字数であって表示幅ではないためです。
レオンは 3 文字なので、残り 7 個ぶんの空白が入ります。ただし全角は 1 文字で 2 列ぶんの見た目を取るため、等幅フォントで並べたときに端が揃いません。自力で揃えるなら
unicodedata.east_asian_widthで 1 文字ずつ列数を数えてパディングする必要があります。表の整形が目的なら tabulate のようなライブラリに任せるほうが早いです。
幅を変数で渡したいときは、幅の部分をさらに {} で囲めます。
w = 8print(f"{3.14159:>{w}.3f}") 3.142おまけ: デバッグ用の =
Python 3.8 以降では、式の後ろに = を置くと式そのものと値を一緒に出してくれます。書式指定と併用もできます。
xg = 1.2345print(f"{xg=}")print(f"{xg = :.2f}")xg=1.2345xg = 1.23print("xg =", xg) と書く手間がなくなるので、値を覗きたいだけの場面はこれで足ります。
まとめ
覚えるのは並び順だけです。埋め文字 → 寄せ → 幅 → 区切り → 精度 → 型。{:>10,.2f} を「右寄せ・幅 10・カンマ区切り・小数 2 桁・浮動小数点」、{:*^9} を「* で埋めて・中央寄せ・幅 9」と読み下せるようになれば、あとは必要な部分を足し引きするだけで済みます。