1416 文字
7 分
f-string の書式指定まとめ(桁揃え・ゼロ埋め・日付)

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
-0042
003.50

-42 が -0042 になっているとおり、この 0 は符号を潰さずに桁だけ埋めます。前章の埋め文字は符号より外側に入る(f"{-42:.>5}" は ..-42)ので、数値として桁を揃えたいときはこちらを使います。

3. カンマ区切り#

, を入れると 3 桁区切り、_ ならアンダースコア区切りになります。

print(f"{1234567:,}")
print(f"{1234567:_}")
1,234,567
1_234_567

幅・区切り・精度は同時に指定できます。並び順は幅 → 区切り → 精度です。

print(f"{1234567.891:>14,.2f}")
1,234,567.89

4. 小数の桁数#

.2f で小数第 2 位まで。% を使うと 100 倍して % を付けてくれるので、率の表示で便利です。

print(f"{2/3:.2f}")
print(f"{0.4567:.1%}")
print(f"{123456:.3g}")
0.67
45.7%
1.23e+05

g は有効数字での指定で、大きすぎる/小さすぎる値は指数表記に切り替わります。

CAUTION

.2f の丸めは四捨五入ではありません。しかも直感から外れる理由が 2 つあります。

print(f"{0.125:.2f}")
print(f"{2.675:.2f}")
0.12
2.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-03
2026/08/03 21:05
08/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.23
Christian Pulisic 8 0.87
Adrien Rabiot 6 12.50
CAUTION

この方法は日本語を混ぜると崩れます。

print(f"{'レオン':<10}|")
print(f"{'Leão':<10}|")
レオン |
Leão |

幅指定が数えているのは文字数であって表示幅ではないためです。レオン は 3 文字なので、残り 7 個ぶんの空白が入ります。ただし全角は 1 文字で 2 列ぶんの見た目を取るため、等幅フォントで並べたときに端が揃いません。

自力で揃えるなら unicodedata.east_asian_width で 1 文字ずつ列数を数えてパディングする必要があります。表の整形が目的なら tabulate のようなライブラリに任せるほうが早いです。

幅を変数で渡したいときは、幅の部分をさらに {} で囲めます。

w = 8
print(f"{3.14159:>{w}.3f}")
3.142

おまけ: デバッグ用の =#

Python 3.8 以降では、式の後ろに = を置くと式そのものと値を一緒に出してくれます。書式指定と併用もできます。

xg = 1.2345
print(f"{xg=}")
print(f"{xg = :.2f}")
xg=1.2345
xg = 1.23

print("xg =", xg) と書く手間がなくなるので、値を覗きたいだけの場面はこれで足ります。

まとめ#

覚えるのは並び順だけです。埋め文字 → 寄せ → 幅 → 区切り → 精度 → 型。{:>10,.2f} を「右寄せ・幅 10・カンマ区切り・小数 2 桁・浮動小数点」、{:*^9} を「* で埋めて・中央寄せ・幅 9」と読み下せるようになれば、あとは必要な部分を足し引きするだけで済みます。

f-string の書式指定まとめ(桁揃え・ゼロ埋め・日付)
https://blog.c12o.net/posts/fstring-format-spec/
作者
Seu (c12o)
公開日
2026-08-03
ライセンス
CC BY-NC-SA 4.0