Pythonで数値を扱うとき、3桁ごとに区切られた読みやすい形式で表示したい場面はとても多いです。
金額、アクセス数、ログ出力、レポートなど、見やすさはそのまま品質につながります。
本記事ではPythonで数値を3桁区切りにする全パターンを網羅し、場面別のおすすめ方法まで整理して解説します。
Pythonで数値を3桁区切りにする基本
カンマ区切りの基本書式
まずはPythonに標準で用意されている「カンマ区切り」用の書式指定から確認します。
Pythonでは","というフォーマット指定子を使うだけで、3桁ごとの区切り(グルーピング)を行えます。

基本のformat関数による3桁区切り
Python組み込みのformat関数を使うと、最もシンプルに3桁区切りを行えます。
# 3桁区切りの基本例
number = 123456789
# format 関数を使った 3 桁区切り
formatted = format(number, ",") # 第2引数に書式を指定
print(formatted)
print(type(formatted)) # 文字列になっているか確認
123,456,789
<class 'str'>
ポイントは、第2引数に","を指定するだけでよいことです。
戻り値は数値ではなく文字列になるので、そのまま計算には使えない点に注意します。
str.formatメソッドでの3桁区切り
同じ指定子","は、文字列のformatメソッドからも利用できます。
# str.format を使った 3 桁区切り
number = 987654321
# {} の中に ":," と書くと 3 桁区切りになる
formatted = "{:,}".format(number)
print("金額:", formatted, "円")
金額: 987,654,321 円
このように"{:,}"の形をひな型として覚えておくと、テンプレート文字列に数値を埋め込みたいときに便利です。
f文字列(f-string)での3桁区切り指定
Python 3.6以降ではf文字列(f-string)が利用でき、コードをより簡潔に書けます。
3桁区切りも、f文字列の中で","を指定するだけです。

f文字列の書式指定の基本
f文字列で3桁区切りを行うコードは非常にシンプルです。
# f文字列を使った 3 桁区切り
price = 1234567
count = 89
# f"{式:,}" のように書くだけで 3 桁区切り
message = f"合計金額は {price:,} 円、個数は {count:,} 個です。"
print(message)
合計金額は 1,234,567 円、個数は 89 個です。
f文字列では{}の中に直接式を書くことができるので、例えば四則演算をしながら3桁区切りにすることも可能です。
unit_price = 980
quantity = 1234
# 式を直接書いて、その結果に対して 3 桁区切りを指定
print(f"売上合計: {unit_price * quantity:,} 円")
売上合計: 1,208,,,,,,,,,,720 円
3桁区切りと小数点・桁数指定を組み合わせる
f文字列では","のほかに、小数点以下の桁数指定なども一度に設定できます。
# 3桁区切り + 小数点以下2桁指定
value = 1234567.89123
# , と .2f を組み合わせる
print(f"{value:,.2f}")
1,234,567.89
書式":,.2f"は次のような意味です。
,… 3桁区切り.2… 小数点以下2桁f… 浮動小数点数として表示
f文字列は可読性が高く、処理も速いため、Python 3.6以降を使う場合は基本的にf文字列を第一候補にするとよいです。
format関数とformatメソッドの違いと使い分け
Pythonでは3桁区切りを行う方法が複数あるため、どれを選ぶか迷うこともあります。
ここではformat関数と文字列のformatメソッドの違いを整理します。

format関数の特徴
format(value, spec)という形で使う組み込み関数です。
number = 123456
print(format(number, ","))
123,456
この形式の特徴は、値と書式を分離しやすいことです。
例えば、書式だけを定数として定義しておきたい場合などに向いています。
FORMAT_SPEC = ",.2f" # 共通のフォーマット指定
value = 12345.678
print(format(value, FORMAT_SPEC))
12,345.68
文字列のstr.formatメソッドの特徴
"テンプレート".format(value)というスタイルです。
テンプレート文字列の再利用性が高く、Python 2 と 3 の両方で使えるため、古いコードベースでも広く利用されています。
template = "商品 {name} の価格は {price:,} 円です"
text = template.format(name="りんご", price=9800)
print(text)
商品 りんご の価格は 9,800 円です
f文字列との比較と使い分け
現在のPythonアプリケーション開発では、次のように使い分けるのが実務的です。
- 新規コード、Python 3.6+ 前提
→f文字列を基本にする - テンプレート文字列を外部ファイルなどに切り出す場合
→str.formatを使うと静的文字列として扱いやすい - 書式だけを共通化したい場合
→format関数でspecを共有すると整理しやすい
localeを使ったPythonの3桁区切り
ここまでの","を使った3桁区切りは、常にカンマとピリオドが固定でした。
しかし、ヨーロッパ圏では「1.234.567,89」のように区切り記号が逆になることがあります。
このように言語や地域ごとのルール(ロケール)に従って3桁区切りを行いたい場合には、localeモジュールを使います。

localeモジュールでカンマ区切りを行う方法
localeモジュールを使うと、現在設定しているロケールに応じて数値を整形できます。
import locale
# 利用可能なロケールの中から、デフォルト(環境依存)を設定
locale.setlocale(locale.LC_ALL, "")
number = 1234567.89
# locale.format_string を使った 3 桁区切り
formatted = locale.format_string("%d", number, grouping=True)
print("整数として:", formatted)
# 小数を含めて表示したい場合
formatted_float = locale.format_string("%.2f", number, grouping=True)
print("小数点以下2桁:", formatted_float)
整数として: 1,234,567
小数点以下2桁: 1,234,567.89
ここでのポイントは次の通りです。
locale.setlocale(locale.LC_ALL, "")で、環境依存のデフォルトロケールを使うlocale.format_string(フォーマット, 値, grouping=True)で3桁区切りを有効化する- 書式指定はC言語風の
"%d"や"%.2f"を使う
日本語環境(ja_JP)と英語環境(en_US)での違い
ロケールを明示的に指定すると、国や言語ごとに数値の表示ルールを切り替えられます。
ただし、OSにそのロケールがインストールされている必要があります。
import locale
number = 1234567.89
# 日本語ロケール
locale.setlocale(locale.LC_ALL, "ja_JP.UTF-8")
print("ja_JP :", locale.format_string("%d", number, grouping=True))
# アメリカ英語ロケール
locale.setlocale(locale.LC_ALL, "en_US.UTF-8")
print("en_US :", locale.format_string("%d", number, grouping=True))
ja_JP : 1,234,567
en_US : 1,234,567
日本語とアメリカ英語では、整数部分の3桁区切りは同じルールです。
違いが大きく出るのは小数点以下の区切りや通貨記号などですが、その一例としてヨーロッパのロケールを見てみます。
import locale
number = 1234567.89
# ドイツロケール (de_DE) の例
locale.setlocale(locale.LC_ALL, "de_DE.UTF-8")
print("de_DE (float):", locale.format_string("%.2f", number, grouping=True))
de_DE (float): 1.234.567,89
小数点と3桁区切りの記号が逆転していることが確認できます。
localeを使う場合の注意点とベストプラクティス
localeはプロセス全体に影響するという重要な特徴があります。
つまり、一度locale.setlocaleを呼び出すと、その後の全ての数値フォーマットや日付フォーマットに影響する可能性があります。

注意すべき点とベストプラクティスを整理すると次のようになります。
- ライブラリ側ではむやみに
setlocaleを呼ばない
ライブラリ内部でロケールを変更すると、利用側のアプリケーション全体に影響が及びます。ロケール変更は、原則としてアプリケーションのエントリーポイント(メイン)で行うべきです。 - 一時的にロケールを変更したい場合は、元に戻す
処理の前後で元のロケールを保存・復元するパターンがよく使われます。
import locale
from contextlib import contextmanager
@contextmanager
def temporary_locale(category, new_locale):
"""一時的にロケールを変更するコンテキストマネージャ"""
saved = locale.setlocale(category) # 現在のロケールを保存
try:
locale.setlocale(category, new_locale)
yield
finally:
locale.setlocale(category, saved) # 元に戻す
number = 1234567.89
with temporary_locale(locale.LC_ALL, "de_DE.UTF-8"):
print("de_DE :", locale.format_string("%.2f", number, grouping=True))
# ここではロケールが元に戻っている
print("current:", locale.setlocale(locale.LC_ALL))
- 数値そのものの保存形式はロケール非依存にする
CSVやDBに保存する値は必ずロケールに依存しない形式で保存し、表示時だけロケールを反映するのが安全です。
他の3桁区切り方法
ここまでで標準的な書式指定とロケールを使った3桁区切りを説明しました。
この章では、Decimal型・正規表現や自作関数・浮動小数点と小数点以下を含むケースといった、少し踏み込んだパターンを扱います。
Decimal型でのフォーマットと3桁区切り
金融計算など小数の誤差が許されない場面では、floatではなくdecimal.Decimalを使うことが推奨されます。
Decimal型も、基本的には通常の数値と同じように3桁区切りでフォーマットできます。

from decimal import Decimal, getcontext
# 精度を設定(必要に応じて)
getcontext().prec = 10
price = Decimal("1234567.89123")
# f文字列で 3 桁区切り + 小数点以下2桁
print(f"{price:,.2f}")
# format 関数でも同様
print(format(price, ",.3f"))
1,234,567.89
1,234,567.891
Decimal型も書式指定のルールはfloatと同じなので、3桁区切りの知識をそのまま活用できます。
正規表現や自作関数での3桁区切り
標準のフォーマット指定子でほとんどの用途は足りますが、特殊な区切りルールやフォーマット前に文字列として処理したい場合など、どうしても自前実装が必要になることがあります。

正規表現で3桁区切りを入れる例
次は、整数部分のみを3桁区切りにする自作関数の一例です。
import re
def add_thousands_separator(value, sep=","):
"""
数値または数値文字列に 3 桁区切りを挿入する。
小数部があればそのまま維持する。
"""
# まず文字列に変換
s = str(value)
# 符号と整数部、小数部に分解
match = re.match(r"([+-]?)(\d+)(\.\d+)?$", s)
if not match:
# 数値でない場合はそのまま返す
return s
sign, integer_part, fraction_part = match.groups()
# 整数部を右から3桁ごとに区切る
# 例: "1234567" -> "1,234,567"
integer_with_sep = re.sub(r"(?<!^)(?=(\d{3})+$)", sep, integer_part)
# それぞれを結合して返す
return f"{sign}{integer_with_sep}{fraction_part or ''}"
# 動作確認
print(add_thousands_separator(1234567))
print(add_thousands_separator(-9876543.21))
print(add_thousands_separator("123456789.987"))
1,234,567
-9,876,543.21
123,456,789.987
この方法は区切り記号sepを任意に変えられるため、例えばスペース区切り"1 234 567"やアンダースコア区切り"1_234_567"なども簡単に対応できます。
自作関数を使う際の注意点
自作実装では、以下のようなケースをしっかり考慮しておく必要があります。
- 負の数(先頭の
-) - 正の符号(
+)が明示されている場合 - 小数点以下の扱い
- 指数表記(
1e10など)をどうするか - 数値以外の文字列が渡ってきた場合の扱い
要件が複雑な場合は標準の書式指定で対応できないかをまず検討し、自作関数は最後の手段にするのが安全です。
浮動小数点と小数点以下を含む3桁区切り
浮動小数点数(float)の3桁区切りでは、小数点以下の桁数と丸め方が重要になります。

value = 1234567.89123
# そのまま(デフォルト表現)
print(f"{value:,}") # 3桁区切りのみ
# 小数点以下2桁
print(f"{value:,.2f}") # 2桁に丸め
# 小数点以下0桁(四捨五入)
print(f"{value:,.0f}") # 整数に丸め
1,234,567.89123
1,234,567.89
1,234,568
浮動小数点の丸め誤差が気になる場合は、前述のDecimal型を使うか、もしくはroundなどで事前に値を整えてからフォーマットするとよいです。
シーン別のおすすめ3桁区切りフォーマット
ここまでで多くの方法を紹介しましたが、実際の開発では「どの場面でどの方法を使うべきか」が重要になります。
この章では、UI表示・ファイル出力・国際化対応の3つの視点からおすすめを整理します。

表示用(UI,ログ)で使うべき3桁区切り
画面表示やログ出力では、読みやすさと実装の簡潔さが最重要です。
そのため、Python 3.6以降であればf文字列が最有力です。
user_count = 1234567
error_count = 34
# ログ出力の例
print(f"[INFO] ユーザ数={user_count:,}, エラー数={error_count:,}")
[INFO] ユーザ数=1,234,567, エラー数=34
UI層(テンプレートエンジン側)で3桁区切りをしたい場合は、共通のフォーマット関数を1つ用意しておき、それをテンプレートから呼ぶという設計にすると、表示ルールを一元管理しやすくなります。
ファイル出力(CSV,レポート)での3桁区切り
CSVや機械処理されることを前提としたファイル出力の場合、数値を文字列として3桁区切りにするのは原則避けるべきです。

CSVなどデータ交換用途では、次のような指針が実務的です。
- 数値は素のまま(1234567.89)で出力する
- 帳票やPDFなど「人間が見る専用」の出力では3桁区切りを適用する
例えば、レポート用のテキストファイルを生成する場合は次のように書けます。
sales = [1234567, 8901234, 567890]
with open("sales_report.txt", "w", encoding="utf-8") as f:
for i, value in enumerate(sales, start=1):
# 表示専用レポートなので 3 桁区切りにして書き出す
line = f"{i}行目: 売上 {value:,} 円\n"
f.write(line)
1行目: 売上 1,234,567 円
2行目: 売上 8,901,234 円
3行目: 売上 567,890 円
同じ売上データをCSVとして別システムに渡す場合は、カンマ区切りを付けず、数値として出力するのが望ましいです。
国際化(i18n)対応での3桁区切りフォーマット選び
複数言語・複数地域をサポートするアプリケーションでは、ユーザのロケールに応じて数字のフォーマットも変える必要があります。

選択肢と特徴を表にまとめます。
| 手段 | 特徴 | 向いている用途 |
|---|---|---|
localeモジュール | 標準ライブラリで軽量だが、プロセス全体に影響 | 単純なサーバーアプリ・バッチ処理 |
Babelなど外部ライブラリ | ロケールごとのフォーマット制御が細かい、スレッドセーフな設計がしやすい | Webアプリ、マルチテナント環境 |
| 自作マッピング + 標準書式 | ロケールごとの記号や桁数を自前で管理 | 対応言語が少ない小規模アプリ |
本格的なi18n対応では、標準のlocaleだけでは足りず、Babelのような専用ライブラリがよく利用されます。
ここでは簡単にlocaleベースでの考え方だけ整理しておきます。
- 内部処理・DB保存は常にロケール非依存の数値
- ユーザのロケール(言語設定)をどこかで決定
- 表示直前にだけ、そのロケールを元に数値を整形
この3段階を明確に分離しておくと、途中から対応言語を増やしたいというときにも拡張しやすくなります。
まとめ
Pythonで数値を3桁区切りにする方法は、f文字列やformatによる","指定を中心に、locale・Decimal型・正規表現や自作関数と多岐にわたります。
日常的なUI表示やログではf文字列によるf"{value:,}"が最も簡潔で、CSVなど機械処理向けのデータでは区切りを付けず素の数値を扱うのが安全です。
国際化が必要な場合には、データと表示を分離し、ロケールに応じてフォーマットを切り替える設計が重要になります。
用途ごとに最適な方法を選び、読みやすく誤解のない数値表現を実現していきましょう。
