C#における文字列操作は、プログラム開発において最も頻繁に行われる作業の一つです。
かつてはString.Formatメソッドや文字列結合(+演算子)が主流でしたが、C# 6.0で導入された文字列補間($記法)の登場により、コードの可読性は飛躍的に向上しました。
変数や式を文字列の中に直接埋め込めるだけでなく、高度な書式指定をシンプルに記述できる点が最大の特徴です。
本記事では、この便利な文字列補間を用いた数値や日付の書式指定、さらにはデータの整列方法について、実戦で役立つテクニックを網羅的に解説します。
文字列補間の基本構造
文字列補間を利用するには、文字列の先頭に$記号を付与します。
これにより、文字列内の{ }(波括弧)の中に変数の名前や式を直接記述できるようになります。

補間式のシンタックス
文字列補間の最も基本的な形は、変数を波括弧で囲むだけのものですが、実際にはより詳細な制御が可能です。
基本的な構文は以下の通りです。
{<interpolationExpression>[,<alignment>][:<formatString>]}
- interpolationExpression: 埋め込む変数や式を指定します。
- alignment: 最小文字幅を指定します(省略可能)。正の数は右揃え、負の数は左揃えになります。
- formatString: 数値や日付の表示形式を制御する書式指定子です(省略可能)。
基本的な使用例
まずは、単純な変数埋め込みのコードを見てみましょう。
using System;
public class Program
{
public static void Main()
{
string name = "アリス";
int age = 25;
// 文字列補間を使用した出力
string message = $"こんにちは、{name}さん。あなたは{age}歳ですね。";
Console.WriteLine(message);
}
}
こんにちは、アリスさん。あなたは25歳ですね。
このように、+ 演算子で文字列をつなげる必要がなく、直感的に文章の構造を把握できるのがメリットです。
数値の書式指定
数値を扱う際、通貨単位を付けたり、小数点以下の桁数を制限したり、パーセント表示にしたりといった要件は非常に多いです。
文字列補間では、コロン(:)に続けて「書式指定子」を記述することで、これらの制御を簡単に行えます。

標準的な数値書式指定子
C#でよく使われる数値書式指定子を以下の表にまとめました。
| 指定子 | 名前 | 説明 | 例 (1234.567) |
|---|---|---|---|
| C | 通貨 (Currency) | 地域の設定に合わせた通貨記号と桁区切りを表示 | ¥1,235 (日本の場合) |
| D | 10進数 (Decimal) | 整数のみ。指定した桁数まで0埋め可能 | 001234 (D6指定時) |
| F | 固定小数点 (Fixed) | 小数点以下の桁数を固定して表示 | 1234.57 (F2指定時) |
| N | 数値 (Number) | 桁区切りカンマと小数点以下の表示 | 1,234.57 |
| P | パーセント (Percent) | 数値を100倍して%記号を付与 | 123,456.70% |
| X | 16進数 (Hex) | 数値を16進数文字列に変換 | 4D2 |
数値書式のサンプルコード
具体的な指定方法をコードで確認します。
using System;
public class Program
{
public static void Main()
{
double price = 1234.5678;
int count = 42;
// 通貨表示 (C)
Console.WriteLine($"価格: {price:C}");
// 小数点第2位まで表示 (F2)
Console.WriteLine($"固定小数点: {price:F2}");
// 桁区切りあり (N)
Console.WriteLine($"数値表示: {price:N1}");
// 0埋めで5桁にする (D5)
Console.WriteLine($"ID: {count:D5}");
// パーセント表示 (P0)
double ratio = 0.85;
Console.WriteLine($"達成率: {ratio:P0}");
}
}
価格: ¥1,235
固定小数点: 1234.57
数値表示: 1,234.6
ID: 00042
達成率: 85%
注意点として、通貨(C)や数値(N)などは、実行環境のカルチャ設定(地域設定)に依存します。
日本国内の環境であれば自動的に「¥」記号が付き、小数点以下は四捨五入されます。
カスタム数値書式
標準的な指定子だけでは足りない場合、#や0を使って独自の書式を作成できます。
- 0: ゼロプレースホルダー。値がない場合は0を表示します。
- #: 桁プレースホルダー。値がない場合は何も表示しません。
double value = 1.2;
Console.WriteLine($"{value:0.00}"); // 1.20 (0埋めされる)
Console.WriteLine($"{value:#.##}"); // 1.2 (#は値がないと表示されない)
日付・時刻の書式指定
DateTime型のオブジェクトを文字列に変換する際も、文字列補間は非常に強力です。
日付の区切り文字や、24時間制と12時間制の切り替えなどを柔軟に指定できます。

標準的な日時書式指定子
よく使われる「短い形式」や「長い形式」の指定子です。
DateTime now = DateTime.Now;
Console.WriteLine($"短い日付: {now:d}"); // 2025/10/25
Console.WriteLine($"長い日付: {now:D}"); // 2025年10月25日
Console.WriteLine($"時刻のみ: {now:t}"); // 14:30
カスタム日時書式
実務では「yyyy/MM/dd」のような特定の形式を求められることが多いため、以下のカスタム指定子を組み合わせて使用します。
| 書式 | 内容 | 例 |
|---|---|---|
| yyyy | 4桁の年 | 2025 |
| MM | 2桁の月 (0埋め) | 08 |
| dd | 2桁の日 (0埋め) | 09 |
| HH | 24時間制の時 | 14 |
| mm | 2桁の分 | 05 |
| ss | 2桁の秒 | 09 |
| ddd | 短縮された曜日 | 月 (日本の設定) |
日時書式のサンプルコード
これらを組み合わせることで、自由自在にレイアウトを作成できます。
using System;
public class Program
{
public static void Main()
{
DateTime dt = new DateTime(2025, 12, 31, 23, 59, 59);
// yyyy/MM/dd HH:mm:ss 形式
Console.WriteLine($"終了時刻: {dt:yyyy/MM/dd HH:mm:ss}");
// 曜日を含める
Console.WriteLine($"日付: {dt:yyyy年MM月dd日(ddd)}");
}
}
終了時刻: 2025/12/31 23:59:59
日付: 2025年12月31日(水)
月を表す「MM」は大文字、分を表す「mm」は小文字であることに注意してください。
これを間違えると、意図しない数値が表示される原因になります。
桁揃えとアライメント
コンソール出力やログファイルへの出力時、複数の行でデータの開始位置を揃えたい場合があります。
文字列補間では、カンマ(,)を使って最小文字幅を指定できます。

アライメントの指定方法
波括弧の中で、式の直後に, 数値を記述します。
- 正の整数 (例: {x, 10}): 指定した幅で右揃えにします。
- 負の整数 (例: {x, -10}): 指定した幅で左揃えにします。
アライメントのサンプルコード
表形式のような出力を再現する例を見てみましょう。
using System;
public class Program
{
public static void Main()
{
string[] items = { "Apple", "Banana", "Cherry" };
int[] prices = { 100, 50, 2000 };
Console.WriteLine($"{"商品名", -10} | {"価格", 8}");
Console.WriteLine(new string('-', 22));
for (int i = 0; i < items.Length; i++)
{
// 商品名を左揃え10文字、価格を右揃え8文字で出力
Console.WriteLine($"{items[i], -10} | {prices[i], 8:C}");
}
}
}
商品名 | 価格
----------------------
Apple | ¥100
Banana | ¥50
Cherry | ¥2,000
この機能を使うことで、PadLeftやPadRightメソッドを個別に呼び出す必要がなくなり、コードが劇的にスッキリします。
特殊なケースの対応(エスケープと三項演算子)
文字列補間を使用している際に、文字列として波括弧自体を表示したい場合や、補間の中で条件分岐を行いたい場合があります。
波括弧のエスケープ
文字列補間の中で{ や} を表示したいときは、それらを2つ重ねて記述します。
int value = 100;
// {{ と }} で波括弧をエスケープ
Console.WriteLine($"値は {{ {value} }} です。");
値は { 100 } です。
補間式内での三項演算子
波括弧の中に直接三項演算子を書くことも可能ですが、ここで一つ注意点があります。
三項演算子の:(コロン)が、書式指定の開始記号と誤認される可能性があるため、式全体を丸括弧( )で囲む必要があります。
bool isActive = true;
// 式全体を()で囲まないとコンパイルエラーになる場合がある
Console.WriteLine($"状態: {(isActive ? "有効" : "無効")}");
C# 11以降の新しい補間機能
最近のC#アップデート(C# 11以降)では、文字列補間がさらに進化しています。
特に「生文字列リテラル(Raw String Literals)」との組み合わせは非常に強力です。

生文字列リテラルと補間
生文字列リテラル(""")を使用すると、エスケープシーケンス(\nなど)を無視して記述できます。
さらに、$$のように$を複数重ねることで、波括弧を何個重ねたら補間とみなすかを指定できるようになりました。
これにより、JSONのような「波括弧を多用する文字列」の生成が非常に楽になります。
string name = "田中";
// $$ を使うことで、{{ }} はそのまま出力され、{{ }} だけが補間対象となる
string json = $$"""
{
"userName": "{{name}}",
"info": "これはJSONのテンプレートです"
}
""";
Console.WriteLine(json);
{
"userName": "田中",
"info": "これはJSONのテンプレートです"
}
この機能により、外部設定ファイルやWeb APIのレスポンス模倣などをプログラム内で組み立てる際のエスケープ地獄から解放されます。
まとめ
C#の文字列補間($記法)は、単なる文字列結合の代用ではなく、強力な書式指定エンジンを内蔵した直感的なツールです。
数値の通貨表示や小数点の制御、日付のカスタムレイアウト、そしてアライメントによるデータの整列など、日常的な開発で必要なフォーマット処理のほとんどを、波括弧一つの記述で完結させることができます。
特にC# 11以降の進化により、JSONなどの複雑な構造を持つ文字列生成も容易になりました。
これからC#のコードを書く際は、従来のString.Formatよりも可読性が高く、メンテナンス性に優れた文字列補間を積極的に活用していきましょう。
適切な書式指定を使いこなすことで、ユーザーにとっても開発者にとっても「見やすい」アウトプットを生み出すことができるはずです。
