Menu

C#の文字列補間とString.Format:書式指定子、配置、カルチャ

C#の$"..."による文字列補間の仕組みを解説します。波かっこの中の式、F2、N0、C、D5、Xなどの書式指定子、表のための配置、波かっこのエスケープ、string.Formatと複合書式、逐語的な補間文字列と生の補間文字列、そして特定のカルチャでの書式設定を扱います。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

文字列補間は、リテラルのテキストと式から文字列を組み立てます。リテラルの前に $ を付け、任意のC#の式を波かっこの中に置くと、その値がテキストに変換されて挿入されます。

出力:

Hello, Maya!
3 items at 4.5 = 13.5
Name has 4 letters, upper: MAYA
Free shipping: yes

補間はC# 6で導入されました。コンパイラはそれを string.Format や string.Concat の呼び出し(C# 10以降は、より効率的なハンドラーのコード)に変換するので、手で文字列を組み立てるより遅くなることはありません。

最後の行の条件式にはかっこが必要です。補間の穴の中ではコロンが書式指定子を始めるので、かっこのない {x > 10 ? "yes" : "no"} はコンパイルエラーになります。

書式指定子

式の後にコロンと書式文字列を置くと、値の書き方を制御できます。同じ書式文字列が ToString("...") や string.Format でも使えます。

出力:

1234567.89
1,234,567.89
1,234,568
00042
FF
00ff
1.23E+006
0.813
81.3%
1,234,567.89
007.5
3.1

標準のコードは次のとおりで、それぞれの後に精度の数値を付けられます。

コード名前例結果
F または F2固定小数点{3.14159:F2}3.14
N または N0桁区切り付きの数値{1234.56:N0}1,235
C通貨(カルチャの記号と形式)en-USでの {9.5:C}$9.50
D5ゼロで埋めた整数{42:D5}00042
X、x16進数{255:X}FF
E2指数表記{1234.5:E2}1.23E+003
P1パーセント(100を掛ける)en-USでの {0.256:P1}25.6%
G一般(最短){2.50m:G}2.50
Rラウンドトリップ(double){0.1:R}0.1

カスタムパターンは、プレースホルダーから書式を組み立てます。0 は常に表示される桁、# は意味がある場合にだけ表示される桁、. は小数点、数値の中の , は桁区切りを有効にし、% は100を掛けます。"0.##" は小数点以下を最大2桁表示して末尾のゼロを落とし、"#,##0.00" は会計で定番の書式です。

すべての数値の書式設定は、表示する値を丸めます。変数そのものは変わりません。値がちょうど中間にある場合(2.25を小数点以下1桁で表示する場合)、ランタイムや型によって丸め方が異なることがあるので、規則が重要なら、先に Math.Round(value, 1, MidpointRounding.AwayFromZero) で明示的に丸めてから書式設定します。

補間での日付

DateTime の値も、同じように日付の書式文字列を受け付けます。

出力:

2026-09-24
24/09/2026 16:05
Thu, Sep 24
Shipped at 16:05 on Thursday
ETA 02:10
2.2 hours

TimeSpan のカスタム書式では、リテラルの文字をバックスラッシュでエスケープする必要があり、通常の文字列リテラルでは \\: と書きます。日付のコード(yyyy、MM、HH、tt など)の一覧と、よくある間違い(mm は分、MM は月)は、DateTimeの書式にあります。

配置とパディング

式の後のカンマで、最小のフィールド幅を設定します。正の数は右寄せ、負の数は左寄せです。書式と組み合わせると、プレーンテキストで表をそろえられます。

出力:

Item          |  Price| Sold
----------------------------
Espresso      |   2.40|  118
Latte         |   3.60|   64
Hot chocolate |   4.25|    9

構文は {expression,alignment:format} で、配置が先、書式が後です。幅より長い値は切り詰められず、行の残りを押し出します。補間の外では、PadLeft と PadRight が同じパディングを行います。

波かっこのエスケープ

波かっこをそのまま出力するには、2つ重ねます:{{ と }}。出力がJSON、CSS、コードの場合に必要になります。

出力:

{ "id": 42, "name": "Ana" }
Set literal: {1, 2, 3}
{42}

このようにJSONを手で組み立てるのは、ちょっとしたログの行なら問題ありません。本物のJSONにはシリアライザーを使います。name の中の引用符や特殊文字を正しく扱ってくれます。

string.Formatと複合書式

C# 6より前は、番号付きのプレースホルダーと引数のリストを受け取る string.Format で書式設定していました。同じ複合書式の構文は、Console.WriteLine、StringBuilder.AppendFormat、TextWriter.Write でも使えます。

出力:

Notebook x4: 14.00
Notebook  |  3.50
echo echo !
Dear Leo, your order #000731 has shipped.

コードでは補間を優先します。値が現れる場所にあるので、プレースホルダーが間違った引数を指すことがありません。テンプレートがデータである場合、たとえばリソースファイルから読み込んだ翻訳済みのメッセージには、今でも string.Format が適しています。対応する引数のないプレースホルダーの番号(引数が2つなのに {2})は、実行時に FormatException を投げます。

カルチャ:区切り文字と通貨の制御

補間、ToString、string.Format は、既定ではすべてスレッドの現在のカルチャを使います。ドイツ語に設定されたマシンでは {1234.5:N2} は 1.234,50 になり、米国では 1,234.50 になります。通貨の書式 C はカルチャの記号を使います。カルチャを明示的に選ぶには、補間文字列を FormattableString として受け取り、プロバイダーを指定して書式設定します。

出力:

Total: 1,234.50
Total: 1.234,50
$1,234.50
1.234,50
1234.5,0.75

人が読むテキストにはユーザーのカルチャを、別のプログラムが読むものには CultureInfo.InvariantCulture を使います。ドイツ語のマシンで現在のカルチャを使って書き出したCSVは数値の中にカンマを含み、他の環境では読めません。.NET 6以降では、string.Create(CultureInfo.InvariantCulture, $"...") が、中間のオブジェクトなしで FormattableString.Invariant と同じことを行います。

逐語的な補間文字列と生の補間文字列

$ は @ と組み合わせて逐語的な補間文字列にできます。バックスラッシュはそのままの文字になり、文字列は複数行にまたがれます。C# 8以降はどちらの順序($@ または @$)も受け付けますが、C# 6と7では $@ が必要です。

出力:

C:\Users\ana\Reports\2026\summary.txt
Report for ana
Year: 2026

C# 11では生の補間文字列が追加されました。$ が1つなら、波かっこはいつもどおり式を表します。$$ なら、1つの波かっこはそのままの文字になり、式には2つの波かっこが必要になるので、JSONやコードのテンプレートが読みやすくなります。

// C# 11 and later
int id = 42;
string name = "Ana";
string json = $$"""
    {
      "id": {{id}},
      "name": "{{name}}"
    }
    """;

C# 11では補間の穴の中で改行することも許されるようになったので、長い式や switch 式を複数行に分けられます。

よくある間違い

  • $ を忘れる。 "Total: {total}" は波かっこをそのまま出力します。コンパイラは警告しません。
  • 波かっこの中のかっこのない三項演算子。 コロンが書式の区切りとして読まれます。
  • 機械が読む出力を現在のカルチャで書式設定する。 小数点のカンマはCSV、JSON、SQLを壊します。インバリアントカルチャを使います。
  • お金に書式なしの ToString() を使う。 2.5m は 2.50 ではなく 2.5 と表示されます。F2、N2、C を使います。
  • ループの中で補間を使って大きな文字列を組み立てる。 反復のたびに新しい文字列が作られます。StringBuilderか string.Join を使います。

よくある質問

C#の文字列補間とは何ですか?

$ を前に付けた文字列リテラルで、波かっこの中の式が評価されて挿入されます:$"Total: {price * qty}"。C# 6で追加され、string.Format や + による連結のほとんどの用途を置き換えます。波かっこの中には、メソッドの呼び出しやプロパティへのアクセスを含め、どんな式でも書けます。

C#で数値を小数点以下2桁で書式設定するには?

コロンの後に書式指定子を付けます。$"{price:F2}" は小数点以下2桁を表示し、$"{price:N2}" は桁区切り付きで同じことをします。補間の外では、同じコードが price.ToString("F2") で使えます。どちらも値そのものは変えずに、表示のために丸めます。

C#の補間文字列で波かっこをエスケープするには?

2つ重ねます:{{ は { を、}} は } を出力します。たとえば $"{{ \"id\": {id} }}" は { "id": 42 } を出力します。C# 11の生の補間文字列では、代わりにリテラルを $$ で始めると、1つの波かっこはそのままの文字になり、{{expr}} が式を表します。

string.Formatと文字列補間の違いは何ですか?

同じ書式コードで同じ結果を生成します。string.Format("{0} costs {1:F2}", name, price) は位置で引数を参照し、$"{name} costs {price:F2}" は式をその場に置くので、読みやすく、引数の順序を間違えることもありません。書式文字列自体がリソースファイルやデータベースから来る場合は、今でも string.Format が必要です。

補間した数値でピリオドではなくカンマが表示されるのはなぜですか?

補間はスレッドの現在のカルチャで書式設定し、多くのカルチャは小数点の区切りにカンマを使うからです。機械が読む出力(ファイル、JSON、URL)では、インバリアントカルチャで書式設定します:FormattableString.Invariant($"{value:F2}")、または.NET 6以降なら string.Create(CultureInfo.InvariantCulture, $"...") です。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める