C# において文字列の操作は、アプリケーション開発のあらゆる場面で登場する非常に重要な要素です。
かつては string.Format メソッドや文字列結合の演算子 + を使用するのが一般的でしたが、現在の C# 開発において主流となっているのは 補間文字列 (Interpolated Strings) です。
補間文字列を利用することで、コードの可読性が飛躍的に向上し、直感的な記述が可能になります。
本記事では、補間文字列の基本から、数値・日付の書式指定、位置合わせ、さらには最新の C# バージョンで追加された高度な機能まで、プロフェッショナルな視点で詳しく解説します。
補間文字列の基本構文
補間文字列は、文字列リテラルの先頭に $ 記号を付与することで定義されます。
この形式を使用すると、文字列の中に波括弧 {} で囲まれた「補間式」を直接埋め込むことができます。
従来の string.Format("{0}", value) と比較して、どの変数がどこに埋め込まれるのかが一目でわかるため、メンテナンス性が極めて高いのが特徴です。
まずは、基本的な使い方を確認しましょう。
using System;
public class Program
{
public static void Main()
{
string name = "TechWriter";
int version = 12;
// 補間文字列の基本
string message = $"Hello, {name}! C# {version} の世界へようこそ。";
Console.WriteLine(message);
}
}
Hello, TechWriter! C# 12 の世界へようこそ。
このように、変数名や式を直接記述できるため、引数の順番を間違えるといったミスを未然に防ぐことができます。
数値の書式指定
補間文字列の中では、変数の後にコロン : を付けることで、標準数値書式指定子を利用できます。
金額表示やパーセント表示など、ビジネスアプリケーションで多用される書式を簡単に適用できます。
通貨・桁区切り・パーセント
よく使われる指定子を以下の表にまとめました。
| 指定子 | 内容 | 説明 |
|---|---|---|
| C | 通貨 (Currency) | 実行環境のロケールに応じた通貨記号と桁区切りを付与 |
| D | 10進数 (Decimal) | 整数のみ。指定した桁数まで 0 で埋める場合に便利 |
| F | 固定小数点 (Fixed-point) | 小数点以下の桁数を制御 |
| N | 数値 (Number) | 桁区切りカンマを付与 |
| P | パーセント (Percent) | 値を 100 倍して % 記号を付与 |
| X | 16進数 (Hexadecimal) | 数値を 16 進数文字列に変換 |
具体的な実装例を見てみましょう。
using System;
using System.Globalization;
public class Program
{
public static void Main()
{
// 日本語環境を明示的に指定して実行
CultureInfo.CurrentCulture = new CultureInfo("ja-JP");
decimal price = 12500.5m;
double ratio = 0.85432;
int id = 42;
// 通貨表示 (C)
Console.WriteLine($"価格: {price:C}");
// 小数点第2位までの固定表示 (F2)
Console.WriteLine($"固定小数点: {price:F2}");
// 桁区切り (N)
Console.WriteLine($"数値: {price:N0}");
// パーセント表示 (P1)
Console.WriteLine($"進捗率: {ratio:P1}");
// 0埋め5桁 (D5)
Console.WriteLine($"ID: {id:D5}");
// 16進数 (X4)
Console.WriteLine($"Hex: {id:X4}");
}
}
価格: ¥12,501
固定小数点: 12500.50
数値: 12,501
進捗率: 85.4%
ID: 00042
Hex: 002A
注意点として、書式指定の結果は実行環境のカルチャ (ロケール) に依存します。
例えば、通貨の記号は日本なら「¥」、アメリカなら「$」になります。
グローバルなアプリケーションを開発する場合は、カルチャの指定に留意してください。
日付と時刻の書式指定
DateTime 型や DateTimeOffset 型に対しても、数値と同様にコロン以降に書式を指定できます。
日付のフォーマットはシステム要件によって細かく指定されることが多いため、カスタム日時書式指定子を使いこなすことが重要です。
よく使う日時書式
yyyy: 4桁の年MM: 2桁の月dd: 2桁の日HH: 24時間制の時mm: 分ss: 秒ddd: 短縮形の曜日
using System;
public class Program
{
public static void Main()
{
DateTime now = DateTime.Now;
// 標準的な日付表示
Console.WriteLine($"短い形式: {now:d}");
// カスタム書式
Console.WriteLine($"カスタム: {now:yyyy年MM月dd日 (ddd) HH:mm:ss}");
// ISO 8601 形式に近い表現
Console.WriteLine($"ISO形式: {now:s}");
}
}
短い形式: 2026/02/21
カスタム: 2026年02月21日 (土) 14:30:05
ISO形式: 2026-02-21T14:30:05
日付操作において、月の MM と分の mm は大文字小文字で意味が異なるため、記述ミスには十分に注意しましょう。
配置と配置幅の指定 (アライメント)
補間文字列の強力な機能の一つに、配置 (Alignment) の指定があります。
コンソールアプリケーションでの表形式の出力や、ログファイルの見栄えを整える際に非常に便利です。
構文は {式, 配置幅:書式} となります。
- 配置幅が 正の値 の場合:右揃え
- 配置幅が 負の値 の場合:左揃え
using System;
public class Program
{
public static void Main()
{
string[] items = { "Apple", "Banana", "Cherry" };
int[] counts = { 10, 150, 5 };
decimal[] prices = { 100m, 50m, 2000m };
Console.WriteLine($"{"Name", -10} | {"Count", 5} | {"Price", 10}");
Console.WriteLine(new string('-', 31));
for (int i = 0; i < items.Length; i++)
{
// 左揃え 10文字、右揃え 5文字、右揃え 10文字(通貨)
Console.WriteLine($"{items[i], -10} | {counts[i], 5} | {prices[i], 10:C}");
}
}
}
Name | Count | Price
-------------------------------
Apple | 10 | ¥100
Banana | 150 | ¥50
Cherry | 5 | ¥2,000
この配置指定を利用することで、PadLeft や PadRight を個別に呼び出す必要がなくなり、コードが非常にスッキリします。
特殊な文字のエスケープ
補間文字列の中で波括弧 { や } 自体を表示したい場合は、それらを二重に記述します。
また、ダブルクォーテーションについてもエスケープが必要です。
| 表示したい文字 | 補間文字列内での記述 |
|---|---|
| { | {{ |
| } | }} |
| “ | “ |
using System;
public class Program
{
public static void Main()
{
int value = 100;
// 波括弧自体を出力する
string jsonLike = $"{{ \"data\": {value} }}";
Console.WriteLine(jsonLike);
}
}
{ "data": 100 }
複雑な JSON 文字列などを組み立てる際に、このエスケープルールが必要になります。
ただし、より複雑な文字列の場合は、後述する「未加工文字列リテラル」の利用を検討すべきです。
C# 11 以降の進化:未加工文字列リテラルと補間
C# 11 では、未加工文字列リテラル (Raw String Literals) が導入されました。
これにより、エスケープの苦労から解放されます。
ダブルクォーテーションを 3 つ以上並べる """ で囲む形式です。
さらに、補間記号 $ を複数個重ねることで、波括弧のエスケープルールも変更できます。
例えば $$ と記述すると、{{ }} が補間式として扱われ、単一の { } はそのまま文字として出力されます。
using System;
public class Program
{
public static void Main()
{
string title = "C# Modern Features";
// $ を2つ使うことで、単一の { } はエスケープなしでそのまま書ける
// {{ title }} が補間対象になる
string xml = $$"""
<article>
<header>{ This is a brace }</header>
<title>{{title}}</title>
</article>
""";
Console.WriteLine(xml);
}
}
<article>
<header>{ This is a brace }</header>
<title>C# Modern Features</title>
</article>
この機能は、SQL クエリや XML、JSON テンプレートなどをコード内に直接記述する際に非常に強力です。
パフォーマンスへの配慮
補間文字列は非常に便利ですが、大量のループ内で頻繁に使用される場合、パフォーマンスが気になるかもしれません。
かつての C# では、補間文字列は内部的に string.Format に変換され、引数のボックス化(Boxing)によるオーバーヘッドが発生していました。
しかし、C# 10 (および .NET 6) 以降では、補間文字列ハンドラー (Interpolated String Handlers) という仕組みが導入されました。
これにより、コンパイラは文字列を構築するための効率的なコードを生成し、不要な割り当てを最小限に抑えるようになっています。
通常のアプリケーション開発においては、パフォーマンスを過度に心配することなく補間文字列を使用して問題ありません。
非常にシビアなパフォーマンスが要求される場所(超高頻度のログ出力など)では、Span<char> と組み合わせた書き込みなどを検討しますが、多くの場合、補間文字列が「最も読みやすく、かつ十分に高速な」選択肢となります。
まとめ
C# の補間文字列は、単なる文字列結合の代替手段ではなく、表現力豊かなフォーマット出力を可能にする強力なツールです。
- $”” の形式で直感的に変数を埋め込める。
- コロン
:を使った数値や日付の高度な書式指定が可能。 - コンマ
,を使った配置指定で、美しい表形式の出力が容易。 - C# 11 の未加工文字列リテラルを併用することで、複雑なテンプレートも可読性を維持したまま記述できる。
- 現代の C# コンパイラは補間文字列を最適化するため、パフォーマンス面でも信頼できる。
これらの機能を適切に使い分けることで、コードの可読性は向上し、バグの少ないクリーンなソースコードを実現できます。
特にビジネスロジックにおける金額や日付の表示は、ユーザーの利便性に直結する部分です。
本記事で紹介したテクニックを活用し、洗練された C# プログラミングを実践してください。
