- Python
- 技術 💻
Python f-string書式指定|全項目の早見表と実行結果・3.14対応
f-string(f文字列)の書式指定とは、f"{値:書式}" のようにコロンの後ろに書く「書式指定ミニ言語」で、桁区切り・ゼロ埋め・寄せ・小数の桁数・進数などを1行で指定する仕組みです。 例えば f"{1234567.891:,.2f}" は '1,234,567.89' になります。
この記事では、書式指定ミニ言語の全項目(fill/align/sign/z/#/0/width/grouping/.precision/type)を「コード→出力」の早見表にまとめ、日付、= デバッグ、!r、幅の変数指定、Decimal、全角文字の幅ずれ対策まで紹介します。出力はすべて Python 3.13.7 で実際に実行した結果です。さらに、3.11と3.12で同じコードを動かして比較した PEP 701 の変更点と、3.14.7で動かした小数部の桁区切り・t-string も載せています。
f-string書式指定の早見表
まずはこの表で用が足ります。 n = 1234567.891、i = 255、x = 42、s = "abc"、r = 0.4567 として実行した結果です。
| やりたいこと | コード | 出力 |
|---|---|---|
| 桁区切り(カンマ) | f"{n:,}" |
'1,234,567.891' |
| 桁区切り+小数2桁 | f"{n:,.2f}" |
'1,234,567.89' |
| 桁区切り(アンダースコア) | f"{n:_}" |
'1_234_567.891' |
| 小数点以下2桁 | f"{3.14159:.2f}" |
'3.14' |
| 有効数字3桁 | f"{3.14159:.3}" |
'3.14' |
| ゼロ埋め5桁 | f"{x:05}" |
'00042' |
| ゼロ埋め+小数 | f"{3.14159:08.3f}" |
'0003.142' |
| 左寄せ | f"{s:<10}|" |
'abc |' |
| 右寄せ | f"{s:>10}|" |
' abc|' |
| 中央寄せ | f"{s:^10}|" |
' abc |' |
| 埋め文字を指定 | f"{s:*^10}" |
'***abc****' |
| 符号を常に付ける | f"{x:+}" |
'+42' |
| 正の数に空白 | f"{x: }" |
' 42' |
| パーセント | f"{r:.1%}" |
'45.7%' |
| 指数表記 | f"{n:.2e}" |
'1.23e+06' |
| 2進数 | f"{i:b}" / f"{i:#b}" |
'11111111' / '0b11111111' |
| 8進数 | f"{i:o}" / f"{i:#o}" |
'377' / '0o377' |
| 16進数 | f"{i:x}" / f"{i:#X}" |
'ff' / '0XFF' |
| 2進数8桁 | f"{5:08b}" |
'00000101' |
| 文字列を切り詰め | f"{s:.2}" |
'ab' |
| 日付 | f"{dt:%Y-%m-%d}" |
'2026-09-28' |
| 変数名=値(デバッグ) | f"{price=}" |
'price=1980' |
| repr で表示 | f"{name!r}" |
"'ボールペン'" |
| 幅を変数で | f"{v:{w}.{p}f}" |
' 3.142'(w=10, p=3) |
| 波かっこ自体 | f"{{name}}" |
'{name}' |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Python f-string書式指定|全項目の早見表と実行結果・3.14対応」
書式指定ミニ言語の構造
書式は「埋め文字・寄せ・符号・z・#・0・幅・区切り・.精度・型」の順に、必要なものだけ書きます。 公式ドキュメント(Python 3.14)の文法は次のとおりです。
format_spec: [options][width_and_precision][type]
options: [[fill]align][sign]["z"]["#"]["0"]
fill: <任意の1文字>
align: "<" | ">" | "=" | "^"
sign: "+" | "-" | " "
width_and_precision: [width][grouping]["." [precision][grouping]]
grouping: "," | "_"
type: "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
例えば f"{-1234.5:_>12,.1f}" は次のように分解できます。
| 部分 | 項目 | 意味 |
|---|---|---|
_ |
fill | 空いた所を _ で埋める |
> |
align | 右寄せ |
12 |
width | 全体で12文字 |
, |
grouping | 3桁ごとにカンマ |
.1 |
precision | 小数1桁 |
f |
type | 固定小数点 |
print(f"{-1234.5:_>12,.1f}")
____-1,234.5
順番を入れ替えると ValueError になるので、「寄せ→符号→0→幅→区切り→精度→型」の並びを覚えておくと迷いません。
項目別の完全一覧(コード→出力)
以下、すべて Python 3.13.7 で実行した出力です。変数は n = 1234567.891、i = 255、x = 42、neg = -42、s = "abc"、r = 0.4567 です。
fill と align:寄せと埋め文字
| コード | 出力 | 説明 |
|---|---|---|
f"{s:<10}|" |
'abc |' |
左寄せ(文字列の既定) |
f"{s:>10}|" |
' abc|' |
右寄せ |
f"{s:^10}|" |
' abc |' |
中央寄せ(余りは右側) |
f"{s:*^10}|" |
'***abc****|' |
* で埋めて中央寄せ |
f"{s:-<10}|" |
'abc-------|' |
- で埋めて左寄せ |
f"{s:10}|" |
'abc |' |
寄せ省略:文字列は左 |
f"{x:10}|" |
' 42|' |
寄せ省略:数値は右 |
f"{neg:=8}" |
'- 42' |
=:符号の後ろを埋める(数値のみ) |
埋め文字を指定するときは、必ず寄せ記号(<>^=)とセットで書きます。
sign と z:符号の表示
| コード | 出力 | 説明 |
|---|---|---|
f"{x:+}" |
'+42' |
正でも + を付ける |
f"{neg:+}" |
'-42' |
負は - |
f"{x:-}" |
'42' |
負のときだけ -(既定) |
f"{x: }" |
' 42' |
正の数の前に空白(桁を揃えやすい) |
f"{-0.0001:.2f}" |
'-0.00' |
丸めた結果がマイナスゼロ |
f"{-0.0001:z.2f}" |
'0.00' |
z(3.11以降)でマイナスゼロを 0.00 に |
z は集計表で「-0.00」が出てしまうときに便利です(浮動小数点の表示型のみ)。
# と 0:進数の接頭辞とゼロ埋め
| コード | 出力 | 説明 |
|---|---|---|
f"{i:#b}" |
'0b11111111' |
2進数に 0b |
f"{i:#o}" |
'0o377' |
8進数に 0o |
f"{i:#x}" |
'0xff' |
16進数に 0x |
f"{i:#X}" |
'0XFF' |
大文字 |
f"{x:05}" |
'00042' |
幅5でゼロ埋め |
f"{neg:08}" |
'-0000042' |
符号の後ろをゼロ埋め |
f"{-42:+06d}" |
'-00042' |
符号+ゼロ埋め |
f"{3.14159:08.3f}" |
'0003.142' |
小数点も幅に含む |
f"{1234567:0=15,}" |
'000,001,234,567' |
ゼロ埋め部分にも区切りが入る |
f"{s:05}" |
'abc00' |
文字列は左寄せのまま右を0で埋める(3.10以降) |
幅は「符号・小数点・区切り文字を含めた全体の文字数」です。f"{3.14159:08.3f}" は 3.142 の5文字に0を3つ足して8文字になります。
width と grouping:幅と桁区切り
| コード | 出力 | 説明 |
|---|---|---|
f"{n:,}" |
'1,234,567.891' |
カンマ区切り |
f"{n:_}" |
'1_234_567.891' |
アンダースコア区切り |
f"{n:,.2f}" |
'1,234,567.89' |
区切り+小数2桁 |
f"{1234567:>15,}|" |
' 1,234,567|' |
幅15で右寄せ+区切り |
f"{i:_b}" |
'1111_1111' |
2進数は4桁ごと |
f"{0xFFFFFFFF:_x}" |
'ffff_ffff' |
16進数も4桁ごと |
, は10進数専用、_ は2・8・16進数では4桁ごとに入ります。
.precision:精度(小数の桁数・切り詰め)
| コード | 出力 | 説明 |
|---|---|---|
f"{3.14159:.2f}" |
'3.14' |
f と組み合わせると小数点以下の桁数 |
f"{3.14159:.3}" |
'3.14' |
型なし・g では有効数字の桁数 |
f"{n:.2e}" |
'1.23e+06' |
指数表記の小数部の桁数 |
f"{r:.1%}" |
'45.7%' |
パーセントの小数桁 |
f"{s:.2}" |
'ab' |
文字列は最大文字数(切り詰め) |
.3 と .3f は意味が違います。 .3 は「有効数字3桁」、.3f は「小数点以下3桁」です。
type:表示型の一覧
| 型 | 対象 | コード | 出力 |
|---|---|---|---|
d |
整数(10進) | f"{1234567:d}" |
'1234567' |
b |
整数(2進) | f"{i:b}" |
'11111111' |
o |
整数(8進) | f"{i:o}" |
'377' |
x / X |
整数(16進) | f"{i:x}" / f"{i:X}" |
'ff' / 'FF' |
c |
整数→文字 | f"{65:c}" |
'A' |
e / E |
指数 | f"{n:e}" / f"{n:.2E}" |
'1.234568e+06' / '1.23E+06' |
f / F |
固定小数点(既定6桁) | f"{n:f}" / f"{float('inf'):F}" |
'1234567.891000' / 'INF' |
g / G |
一般(桁数で自動切替) | f"{n:g}" / f"{n:G}" |
'1.23457e+06' / '1.23457E+06' |
g |
小さい数 | f"{0.00001234:g}" |
'1.234e-05' |
g |
末尾の0を消す | f"{12.0:g}" |
'12' |
% |
パーセント(100倍) | f"{r:%}" |
'45.670000%' |
n |
ロケール対応の数値 | f"{1234567:n}" |
'1234567'(Cロケール) |
s |
文字列 | f"{s:s}" |
'abc' |
fは既定で小数6桁、%も同じく6桁です。桁数は.2f.1%のように指定します。gは「有効数字6桁」で、桁が大きい・小さいと自動で指数表記になります。12.0を12と表示したいときにも使えます。
n:ロケールに合わせた区切り
n は、locale.setlocale() で設定した地域の区切り文字を使います。 既定のCロケールでは区切りが付きません。ロケールを生成した環境で実行した結果です。
import locale
for loc in ["ja_JP.UTF-8", "en_US.UTF-8", "de_DE.UTF-8"]:
locale.setlocale(locale.LC_ALL, loc)
print(loc, f"{1234567:n}", f"{1234567.891:.10n}")
ja_JP.UTF-8 1,234,567 1,234,567.891
en_US.UTF-8 1,234,567 1,234,567.891
de_DE.UTF-8 1.234.567 1.234.567,891
n は g と同じ「有効数字」扱いなので、小数を出すときは .10n のように桁を多めに指定します。サーバーのロケール設定に左右されるため、日本向けの表示で固定したいなら , を使うほうが確実です。
日付の書式指定(strftime を f-string で)
datetime を f-string に入れると、コロンの後ろに strftime の書式をそのまま書けます。 dt = datetime(2026, 9, 28, 14, 5, 9, 123456) で実行した結果です。
from datetime import datetime
dt = datetime(2026, 9, 28, 14, 5, 9, 123456)
print(f"{dt:%Y-%m-%d}")
print(f"{dt:%Y年%m月%d日}")
print(f"{dt:%Y-%m-%d} {dt.month}月{dt.day}日")
print(f"{dt=:%Y-%m-%d}")
2026-09-28
2026年09月28日
2026-09-28 9月28日
dt=2026-09-28
よく使う日付の書式指定子
| 指定子 | 意味 | 出力 |
|---|---|---|
%Y / %y |
西暦4桁 / 2桁 | 2026 / 26 |
%m / %d |
月 / 日(0埋め2桁) | 09 / 28 |
%H / %I |
時(24時間 / 12時間) | 14 / 02 |
%M / %S |
分 / 秒 | 05 / 09 |
%f |
マイクロ秒 | 123456 |
%p |
AM/PM | PM |
%a / %A |
曜日(短縮 / 完全) | Mon / Monday |
%b / %B |
月名(短縮 / 完全) | Sep / September |
%j |
年内の通算日 | 271 |
%U / %W |
週番号(日曜始まり / 月曜始まり) | 39 / 39 |
%G-W%V-%u |
ISO週番号 | 2026-W40-1 |
%w |
曜日番号(日曜=0) | 1 |
%c / %x / %X |
ロケールの日時 / 日付 / 時刻 | Mon Sep 28 14:05:09 2026 / 09/28/26 / 14:05:09 |
%% |
% そのもの |
% |
%-m/%-d |
0埋めなし(Linux・macOSのみ) | 9/28 |
- 月や日を0埋めなしで出したいときは、
{dt.month}月{dt.day}日と属性を直接書くのがどのOSでも動く方法です(%-mはWindowsでは使えません)。 %a%b%cはロケールで変わります。ja_JP.UTF-8 を設定すると%a %bは月 9月になりました。- timedelta には strftime 書式が使えません。
f"{timedelta(hours=1):%H:%M}"はTypeError: unsupported format string passed to datetime.timedelta.__format__になります。
= でデバッグ表示(Python 3.8以降)
{変数=} と書くと「式のテキスト=値」を出力します。 print デバッグで変数名を二度書かずに済みます。
price = 1980
name = "ボールペン"
rate = 0.12345
print(f"{price=}")
print(f"{price = }")
print(f"{rate=:.2%}")
print(f"{name=}")
print(f"{name=!s}")
print(f"{price*2=}")
print(f"{len(name)=}")
price=1980
price = 1980
rate=12.35%
name='ボールペン'
name=ボールペン
price*2=3960
len(name)=5
= を使うと既定で repr(!r)表示になるので、文字列はクォート付きになります。書式指定(:.2%)を付けるとそちらが優先され、!s を付けるとクォートなしになります。= の前後の空白もそのまま出力されます。
!r・!s・!a:変換フラグ
!r は repr()、!s は str()、!a は ascii() を通してから表示します。
class Item:
def __init__(self, name):
self.name = name
def __str__(self):
return f"商品:{self.name}"
def __repr__(self):
return f"Item(name={self.name!r})"
it = Item("ノート")
name = "ボールペン"
s = "こんにちは\n"
print(f"{it}")
print(f"{it!s}")
print(f"{it!r}")
print(f"{'café'!a}")
print(f"{s!r}")
print(f"{name!r:>12}|")
商品:ノート
商品:ノート
Item(name='ノート')
'caf\xe9'
'こんにちは\n'
'ボールペン'|
| フラグ | 使いどころ |
|---|---|
!r |
ログで文字列の前後の空白や改行を見える形にする |
!s |
= と組み合わせてクォートを外す |
!a |
ASCII以外の文字をエスケープ表記(é → \xe9 など)にして、出力先の文字コードの影響を避ける |
変換フラグは書式指定より先に書きます({name!r:>12})。
幅や精度を変数で指定する(ネスト)
書式の中に {} を入れると、幅・精度・寄せを変数で変えられます。
v = 3.14159265
w, p, a, fmt = 10, 3, "^", ".2f"
print(f"{v:{w}.{p}f}|")
print(f"{v:{a}{w}.{p}}|")
print(f"{v:{fmt}}")
print(f"{v:>{w+2}.{p}f}|")
3.142|
3.14 |
3.14
3.142|
表の列幅をデータの最大長に合わせたいときは、w = max(len(x) for x in names) を求めてから f"{x:<{w}}" と書けます。
辞書・属性・インデックスにアクセスする
order = {"id": 101, "item": "ノート", "qty": 3}
items = ["A", "B", "C"]
print(f"{order['item']} x {order['qty']}")
print(f"{items[0]}, {items[-1]}")
print("注文{0[id]}: {0[item]}".format(order))
ノート x 3
A, C
注文101: ノート
Python 3.11以前では、外側と違う引用符(" の中なら ')で辞書のキーを書きます。 3.12以降は同じ引用符も使えます(後述)。str.format() ではキーをクォートせず {0[item]} と書く点が違います。
複数行のf-string
name, qty, unit = "ボールペン", 3, 120
msg = (f"品名: {name}\n"
f"数量: {qty:>4}\n"
f"金額: {qty*unit:>6,}円")
print(msg)
html = f"""
<li>{name}</li>
<li>{qty*unit:,}円</li>
""".strip()
print(html)
品名: ボールペン
数量: 3
金額: 360円
<li>ボールペン</li>
<li>360円</li>
かっこで囲んで並べたf-stringは自動で連結されます。 三重引用符の f"""...""" はテンプレートのように書けます。
format()・str.format()・% 演算子との対応表
書式指定ミニ言語は f-string・format()・str.format() で共通です。 % 演算子は別の書き方です。v = 1234567.891 で実行しました。
| やりたいこと | f-string | str.format() |
% 演算子 |
出力 |
|---|---|---|---|---|
| 小数2桁+区切り | f"{v:,.2f}" |
"{:,.2f}".format(v) |
(区切りなし)"%.2f" % v |
1,234,567.89 / 1234567.89 |
| 組み込み関数 | format(v, ",.2f") |
― | ― | 1,234,567.89 |
| ゼロ埋め | f"{3.14159:08.3f}" |
"{:08.3f}".format(3.14159) |
"%08.3f" % 3.14159 |
0003.142 |
| 右寄せ8桁 | f"{'abc':>8}" |
"{:>8}".format("abc") |
"%8s" % "abc" |
abc |
| 左寄せ8桁 | f"{'abc':<8}" |
"{:<8}".format("abc") |
"%-8s" % "abc" |
abc |
| 16進数 | f"{255:#x}" |
"{:#x}".format(255) |
"%#x" % 255 |
0xff |
| 符号付き | f"{42:+}" |
"{:+}".format(42) |
"%+d" % 42 |
+42 |
| 指数 | f"{v:e}" |
"{:e}".format(v) |
"%e" % v |
1.234568e+06 |
| repr | f"{s!r}" |
"{!r}".format(s) |
"%r" % s |
'abc' |
| 名前で指定 | f"{item}" |
"{item}".format(item=...) |
"%(item)s" % d |
― |
% 記号 |
f"{50}%" |
"{}%".format(50) |
"%d%%" % 50 |
50% |
使い分けの目安:その場の変数を埋め込むなら f-string、書式を先に定義して後から値を入れる(テンプレートを設定ファイルに置く等)なら str.format()、logging のメッセージは % 形式(logger.info("件数: %d", n))が標準です。
Decimal の書式指定と丸め
Decimal も同じ書式指定が使えます。 ただし丸め方が float と違います。
from decimal import Decimal, ROUND_HALF_UP
print(f"{Decimal('1234.5'):,.2f}")
print(f"{Decimal('0.125'):.2f}", f"{Decimal('0.135'):.2f}")
print(f"{2.675:.2f}", f"{Decimal('2.675'):.2f}")
print(f"{Decimal('1E+3'):f}", f"{Decimal('0.1234'):%}")
print(Decimal("2.675").quantize(Decimal("0.01"), rounding=ROUND_HALF_UP))
print(f"{2.5:.0f}", f"{3.5:.0f}")
1,234.50
0.12 0.14
2.67 2.68
1000 12.34%
2.68
2 4
| 結果 | 理由 |
|---|---|
Decimal('0.125') → 0.12 |
Decimal の既定は偶数丸め(ROUND_HALF_EVEN)。5の前が偶数なら切り捨て |
2.675 → 2.67 |
float の 2.675 は内部的に 2.67499… なので切り捨てになる |
Decimal('2.675') → 2.68 |
10進で正確に持っているので偶数丸めで 2.68 |
2.5:.0f → 2 |
float の書式も偶数丸め |
金額の四捨五入を確実にしたいときは、Decimal と quantize(..., rounding=ROUND_HALF_UP) で丸めてから f-string で表示します。
全角文字で幅がずれる問題と対処
f-string の幅は「文字数」で数えるため、全角文字が入ると表示がずれます。 実行結果です。
rows = [("ノート", 120), ("Pen", 80), ("消しゴムA", 60)]
for name, price in rows:
print(f"{name:<10}|{price:>5}")
ノート | 120
Pen | 80
消しゴムA | 60
ノート は3文字なので7文字の空白が足されますが、全角は半角2文字分の幅で表示されるため右にずれます。unicodedata.east_asian_width() で表示幅を数える関数を作ると揃います。
import unicodedata
def text_width(s: str) -> int:
"""全角(F/W)を2、それ以外を1として数えた表示幅"""
return sum(2 if unicodedata.east_asian_width(c) in "FW" else 1 for c in s)
def pad(s: str, width: int, align: str = "<", fill: str = " ") -> str:
"""表示幅で左・右・中央寄せする"""
space = max(width - text_width(s), 0)
if align == "<":
return s + fill * space
if align == ">":
return fill * space + s
left = space // 2
return fill * left + s + fill * (space - left)
rows = [("ノート", 120), ("Pen", 80), ("消しゴムA", 60)]
for name, price in rows:
print(f"{pad(name, 10)}|{price:>5}")
print(f"{pad('中央', 10, '^', '*')}|")
ノート | 120
Pen | 80
消しゴムA | 60
***中央***|
| 文字 | east_asian_width |
数えた幅 |
|---|---|---|
ア・あ・ー |
W(全角) |
2 |
ア(半角カナ) |
H |
1 |
A |
Na |
1 |
①・Ω |
A(曖昧) |
1 |
A(曖昧)の文字は環境によって幅1にも2にもなります。 日本語環境の端末で ① などがずれる場合は、判定に "FWA" を使うと合わせられます。外部ライブラリの wcwidth を使う方法もあります。
Python 3.12の変更(PEP 701)を3.11と比較
Python 3.12 から、f-string の {} の中に「同じ引用符」「バックスラッシュ」「コメント」「改行」を書けるようになりました。 同じファイルを Python 3.11.15 と 3.12.3 で実行した結果です。
| 書いたコード | 3.11.15 | 3.12.3 |
|---|---|---|
f"{order["item"]}"(同じ引用符) |
SyntaxError: f-string: unmatched '[' |
ノート を 3 冊 |
f"{'\n'.join(names)}"(バックスラッシュ) |
SyntaxError: f-string expression part cannot include a backslash |
改行で連結される |
{} 内に # コメント |
SyntaxError(単一引用符:unterminated string literal、三重引用符:f-string expression part cannot include '#') |
合計: 360円 |
f"{f"{f"{f"{1+1}"}"}"}"(入れ子) |
SyntaxError: f-string: expecting '}' |
2 |
3.12で動いたコメント入りのコードです。
qty, unit = 3, 120
total = f"合計: {
qty * unit # 数量 × 単価
:,}円"
print(total)
合計: 360円
3.11以前でも動かす必要があるコードでは、次のように書き換えます。
| 3.12以降の書き方 | 3.11以前でも動く書き方 |
|---|---|
f"{order["item"]}" |
f"{order['item']}" |
f"{'\n'.join(names)}" |
nl = "\n" を先に定義して f"{nl.join(names)}" |
{} 内のコメント |
式を変数に入れてから埋め込む |
Python 3.14の新機能
小数部にも桁区切り(3.14)
Python 3.14 から、精度の後ろにも , や _ を書けるようになり、小数部を3桁ごとに区切れます。 Python 3.14.7 と 3.13.7 で実行した結果です。
print(f"{1234567.891011:,.6_f}")
print(f"{1234567.891011:_.6,f}")
print(f"{0.123456789:.9_f}")
# Python 3.14.7
1,234,567.891_011
1_234_567.891,011
0.123_456_789
# Python 3.13.7
ValueError: Invalid format specifier ',.6_f' for object of type 'float'
t-string(テンプレート文字列、PEP 750)
t-string は t"..." と書き、文字列ではなく Template オブジェクトを返す新しいリテラルです。 埋め込む値と固定の文字列を分けて受け取れるので、HTMLのエスケープやSQLのパラメータ化などを「埋め込む前に」処理できます。Python 3.14.7 で実行しました。
import html
from string.templatelib import Interpolation, Template
name = "<b>ノート</b>"
qty = 3
t = t"商品: {name} 数量: {qty:>3}"
print(type(t))
print(t.strings)
print(t.values)
for part in t:
print(repr(part))
def render_html(template: Template) -> str:
out = []
for part in template:
if isinstance(part, Interpolation):
value = format(part.value, part.format_spec)
out.append(html.escape(value))
else:
out.append(part)
return "".join(out)
print(render_html(t))
print(f"商品: {name} 数量: {qty:>3}")
<class 'string.templatelib.Template'>
('商品: ', ' 数量: ', '')
('<b>ノート</b>', 3)
'商品: '
Interpolation('<b>ノート</b>', 'name', None, '')
' 数量: '
Interpolation(3, 'qty', None, '>3')
商品: <b>ノート</b> 数量: 3
商品: <b>ノート</b> 数量: 3
Interpolationには値・式のテキスト・変換フラグ・書式指定('>3')が入っていて、書式の適用は受け取った側が行います(上の例ではformat(part.value, part.format_spec))。str(t)は結合した文字列にはならず、Template(strings=(...), interpolations=(...))という表示になりました。文字列が欲しい場面では今までどおり f-string を使います。- Python 3.13 で同じコードを実行すると、
t"..."の行でSyntaxError: invalid syntaxになります。
よくあるエラーと直し方
実際に実行したエラーメッセージです。
| コード | エラー | 直し方 |
|---|---|---|
f"{3.14:d}" |
ValueError: Unknown format code 'd' for object of type 'float' |
.0f を使う、または int() で変換 |
f"{42:s}" |
ValueError: Unknown format code 's' for object of type 'int' |
型指定を外す(f"{42}") |
f"{'abc':,}" |
ValueError: Cannot specify ',' with 's'. |
数値に変換してから区切る |
f"{None:>5}" |
TypeError: unsupported format string passed to NoneType.__format__ |
f"{None!s:>5}" → ' None' |
f"{[1,2]:>8}" |
TypeError: unsupported format string passed to list.__format__ |
!s を付けて文字列にしてから寄せる |
f"{x}"(x未定義) |
NameError: name 'x' is not defined |
f-string は定義時にすぐ評価される |
None やリストに幅指定をすると TypeError になります。 データに None が混ざる列を表示するときは !s を付けるのが手軽です。
よくある質問
Q. f-string と format() はどちらを使えばよいですか?
A. 変数をその場で埋め込むなら f-string が短く読みやすいです。書式文字列を設定ファイルや定数として先に用意し、後から値を入れる場合は str.format() が向いています。書式指定ミニ言語はどちらも同じなので、この記事の表はそのまま使えます。
Q. 小数点以下の不要な0を消すには?
A. f"{12.0:g}" → '12' のように g を使います。ただし g は有効数字6桁で大きな数を指数表記にするため、f"{1234567.0:g}" は '1.23457e+06' になります。桁数が大きい値では f"{v:.2f}".rstrip("0").rstrip(".") のように後処理する方法もあります。
Q. 波かっこ {} を文字として出したいときは?
A. {{ と }} のように2つ重ねます。f"{{{name}}}" は '{ボールペン}' になります。
まとめ
- 書式は「埋め文字・寄せ・符号・z・#・0・幅・区切り・.精度・型」の順に、必要なものだけ書きます。
- 桁区切りは
,、ゼロ埋めは05、小数2桁は.2f、パーセントは.1%が基本の4つです。 .3は有効数字、.3fは小数点以下の桁数で意味が違います。- 日付は
f"{dt:%Y-%m-%d}"、0埋めなしは{dt.month}のように属性を使うとOSを問いません。 {変数=}でデバッグ表示、!rで repr 表示ができます。- 全角文字は
unicodedata.east_asian_width()で幅を数えて揃えます。 - 3.12で同じ引用符・バックスラッシュ・コメントが使えるようになり、3.14で小数部の区切りと t-string が加わりました。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Python f-string書式指定|全項目の早見表と実行結果・3.14対応」
株式会社RJCでは、f-stringのような日々のコードを読みやすくする書き方を、プロジェクトの中で仲間と教え合っています。こうした知識を共有しながら、日々技術を磨いています。
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。