C#のString.Formatメソッドにおける書式指定子の使い方を解説します。0埋め、桁数指定、3桁区切り、通貨記号やパーセント表示などの実践的な書式設定方法が学べます。標準書式指定子とカスタム書式指定子の違い、エスケープ処理、複数文字列の連結など、数値や文字列を見やすく整形するテクニックが習得できます。
目次
C#のString.Formatメソッドとは

C#のString.Formatメソッドは、文字列の中に変数や値を埋め込んで、整形された文字列を生成するための強力な機能です。プログラミングにおいて、数値や日付などのデータを見やすい形式で表示したり、ログメッセージを作成したりする際に頻繁に使用されます。このメソッドを使うことで、可読性の高いコードを保ちながら、複雑な文字列の生成を簡潔に記述できます。
String.Formatメソッドは、System.String クラスの静的メソッドとして提供されており、複合書式指定文字列と呼ばれる特殊な構文を用いて、プレースホルダーに値を代入します。これにより、文字列の連結演算子を何度も使用する煩雑さから解放され、保守性の高いコードを実現できます。
String.Formatメソッドの基本的な使い方
String.Formatメソッドの基本的な構文は、第1引数に書式指定文字列を指定し、第2引数以降に埋め込む値を順番に渡す形式です。書式指定文字列の中では、中カッコ(波括弧)で囲まれたインデックス番号を使ってプレースホルダーを記述します。
string name = "田中";
int age = 25;
string message = String.Format("こんにちは、{0}さん。{1}歳ですね。", name, age);
// 出力: こんにちは、田中さん。25歳ですね。
上記の例では、{0}が第1引数のname、{1}が第2引数のageに対応しています。インデックスは0から始まる点に注意が必要です。同じインデックスを複数回使用することも可能で、これにより同じ値を文字列の異なる位置に埋め込むことができます。
string product = "ノートパソコン";
string message = String.Format("{0}は人気商品です。{0}の在庫を確認してください。", product);
// 出力: ノートパソコンは人気商品です。ノートパソコンの在庫を確認してください。
また、プレースホルダー内にはインデックス番号だけでなく、書式指定子を追加することで、数値の桁数や日付の表示形式などを細かく制御できます。
double price = 12345.6789;
string formattedPrice = String.Format("価格: {0:N2}円", price);
// 出力: 価格: 12,345.68円
String.Formatメソッドは多数のオーバーロードが用意されており、パラメータの数や型に応じて最適なメソッドが選択されます。配列を使用して可変長の引数を渡すことも可能です。
中カッコのエスケープ方法
String.Formatメソッドでは、中カッコ({ と })はプレースホルダーを示す特殊文字として扱われます。そのため、文字列内に実際の中カッコ文字を表示したい場合は、エスケープ処理が必要になります。エスケープしないまま使用すると、FormatExceptionが発生する可能性があります。
中カッコをエスケープするには、二重にして記述します。つまり、開き中カッコを表示したい場合は{{、閉じ中カッコを表示したい場合は}}と記述します。
string message = String.Format("オブジェクトの形式: {{ {0} }}", "データ");
// 出力: オブジェクトの形式: { データ }
上記の例では、{{と}}がそれぞれ{と}として出力され、{0}の部分には「データ」という文字列が埋め込まれます。この仕組みを理解しておくことで、JSONデータやコードスニペットなど、中カッコを含む文字列を生成する際にも対応できます。
string jsonFormat = String.Format("{{ \"name\": \"{0}\", \"age\": {1} }}", "山田", 30);
// 出力: { "name": "山田", "age": 30 }
エスケープが必要な文字は中カッコのみであり、他の特殊文字(バックスラッシュや引用符など)については通常の文字列リテラルのエスケープルールが適用されます。中カッコのエスケープルールは直感的でシンプルなため、一度覚えてしまえば容易に使いこなせるでしょう。
書式指定文字列の基礎知識

C#のString.Formatメソッドを効果的に活用するためには、書式指定文字列の仕組みを正しく理解することが重要です。書式指定文字列は、変数やオブジェクトの値をどのように文字列として表現するかを制御する強力な機能であり、数値の桁数調整や日付の表示形式、通貨記号の付与など、様々な場面で活用できます。ここでは、書式指定文字列の基本的な構文と、標準書式指定子とカスタム書式指定子の違いについて詳しく解説します。
複合書式指定の構文
複合書式指定は、c# string formatにおける書式指定文字列の基本となる構文です。この構文を使用することで、文字列内に変数の値を挿入し、同時にその表示形式を細かく制御することができます。
複合書式指定の基本構文は次のような形式になります。
{index[,alignment][:formatString]}この構文は3つの要素から構成されており、それぞれが異なる役割を持っています。各要素の詳細を以下に示します。
- index: 書式指定される引数のゼロベースのインデックスを指定します。必須の要素です。
- alignment: 出力される文字列の最小幅と配置を指定します。正の値で右揃え、負の値で左揃えになります。オプション要素です。
- formatString: 値の表示形式を制御する書式指定子を指定します。オプション要素です。
具体的なコード例を見てみましょう。
// 基本的なインデックス指定
string result1 = String.Format("{0}と{1}", "りんご", "みかん");
// 出力: りんごとみかん
// 配置指定を含む例
string result2 = String.Format("{0,10}", "商品");
// 出力: " 商品" (右揃え、幅10文字)
string result3 = String.Format("{0,-10}", "商品");
// 出力: "商品 " (左揃え、幅10文字)
// 書式指定子を含む例
string result4 = String.Format("{0:D5}", 42);
// 出力: 00042 (5桁のゼロ埋め)
// すべての要素を組み合わせた例
string result5 = String.Format("{0,10:C}", 1234.56);
// 出力: " ¥1,235" (右揃え、幅10文字、通貨形式)複合書式指定では、同じインデックスを複数回使用することも可能です。これにより、同じ値を異なる形式で複数箇所に表示できます。
string result = String.Format("{0}円は{0:X}進数で表現できます", 255);
// 出力: 255円はFF進数で表現できます注意点として、インデックスは必ず引数の数の範囲内である必要があります。範囲外のインデックスを指定すると、FormatExceptionが発生します。
標準書式指定子とカスタム書式指定子の違い
c# string formatで使用される書式指定子には、大きく分けて「標準書式指定子」と「カスタム書式指定子」の2種類があります。それぞれ異なる特性と用途を持っており、状況に応じて適切に使い分けることが重要です。
標準書式指定子は、あらかじめ定義された一般的な書式パターンを単一の文字で指定できる便利な機能です。1つのアルファベット文字と、オプションの精度指定子から構成されます。標準書式指定子は、次のような形式で記述します。
{0:標準書式指定子[精度指定子]}主な標準書式指定子の例を以下の表に示します。
| 指定子 | 名称 | 説明 | 例 |
|---|---|---|---|
| C | 通貨 | 通貨形式で表示 | {0:C} → ¥1,234 |
| D | 10進数 | 整数を10進数で表示 | {0:D5} → 00123 |
| E | 指数 | 指数表記で表示 | {0:E} → 1.234000E+003 |
| F | 固定小数点 | 固定小数点形式で表示 | {0:F2} → 1234.56 |
| N | 数値 | 3桁区切りの数値形式 | {0:N} → 1,234.56 |
| X | 16進数 | 16進数形式で表示 | {0:X} → 4D2 |
// 標準書式指定子の使用例
decimal price = 12345.67m;
Console.WriteLine(String.Format("{0:C}", price)); // ¥12,346
Console.WriteLine(String.Format("{0:F3}", price)); // 12345.670
Console.WriteLine(String.Format("{0:N}", price)); // 12,345.67一方、カスタム書式指定子は、より細かく柔軟に書式をカスタマイズできる機能です。複数の特殊文字を組み合わせて、独自の表示パターンを作成できます。カスタム書式指定子を使用すると、標準書式指定子では実現できない細かな書式設定が可能になります。
主なカスタム書式指定子の文字には、以下のようなものがあります。
- 0: ゼロプレースホルダー。対応する桁がない場合は0を表示
- #: 桁プレースホルダー。対応する桁がない場合は何も表示しない
- .: 小数点の位置を指定
- ,: 桁区切り記号または数値スケール指定子
- %: パーセント記号。値を100倍して表示
// カスタム書式指定子の使用例
double value = 1234.5;
// ゼロプレースホルダー
Console.WriteLine(String.Format("{0:0000.00}", value));
// 出力: 1234.50
// 桁プレースホルダー
Console.WriteLine(String.Format("{0:####.##}", value));
// 出力: 1234.5
// 複雑なカスタム書式
Console.WriteLine(String.Format("{0:0,0.00}", value));
// 出力: 1,234.50
// パーセント表示
Console.WriteLine(String.Format("{0:0.00%}", 0.1234));
// 出力: 12.34%標準書式指定子とカスタム書式指定子の主な違いをまとめると、次のようになります。
| 比較項目 | 標準書式指定子 | カスタム書式指定子 |
|---|---|---|
| 記述方法 | 単一文字(+精度指定子) | 複数の特殊文字の組み合わせ |
| 柔軟性 | 定義済みパターンのみ | 高い柔軟性とカスタマイズ性 |
| 簡潔性 | 簡潔で記述が容易 | 複雑だが詳細な制御が可能 |
| カルチャ対応 | 自動的にカルチャに対応 | 明示的な指定が必要 |
一般的なルールとして、標準書式指定子で要件が満たせる場合はそちらを使用し、より細かい制御が必要な場合にカスタム書式指定子を使用するのが推奨されます。標準書式指定子はカルチャ設定に自動的に対応するため、国際化対応のアプリケーションでは特に有用です。
数値の書式指定方法

C#のString.Formatメソッドで数値を扱う場合、さまざまな書式指定オプションを使うことで、桁数の調整やカンマ区切りなど、目的に応じた表示形式を実現できます。数値の書式指定は業務アプリケーションやレポート出力において頻繁に使用される機能であり、適切な書式設定を行うことでユーザーにとって見やすく理解しやすい出力が可能になります。ここでは、実務でよく使われる数値の書式指定方法について詳しく解説します。
ゼロ埋めで桁数を揃える方法
数値を固定桁数で表示したい場合、ゼロ埋め(ゼロパディング)を使用すると便利です。特に連番の管理番号や日付の表示など、桁数を揃えて視覚的に整列させたい場合に有効です。
C#のString.Formatでゼロ埋めを行うには、書式指定文字列で「D」指定子または「0」パターンを使用します。以下のコードは、整数値をゼロ埋めで表示する方法を示しています。
int number = 42;
// D指定子を使用(整数型のみ)
string result1 = string.Format("{0:D5}", number);
Console.WriteLine(result1); // 出力: 00042
// 0パターンを使用
string result2 = string.Format("{0:00000}", number);
Console.WriteLine(result2); // 出力: 00042
// 複数の数値を揃える例
for (int i = 1; i = 100; i++)
{
Console.WriteLine(string.Format("No.{0:D3}", i));
// 出力: No.001, No.002, ..., No.100
}
注意点として、D指定子は整数型にのみ使用できます。浮動小数点型の数値に対してD指定子を使用するとエラーが発生するため、その場合は「0」パターンを使用してください。また、指定した桁数よりも元の数値の桁数が大きい場合は、元の桁数のまま表示されます。
小数点以下の桁数を指定する方法
浮動小数点数を扱う際、小数点以下の桁数を制御することは非常に重要です。計算結果の表示や金額の表現など、用途に応じて適切な桁数を設定することで、データの可読性と正確性を向上させることができます。
String.Formatで小数点以下の桁数を指定するには、「F」指定子や「0」「#」パターンを使用します。以下に具体的な実装例を示します。
double value = 123.456789;
// F指定子で小数点以下2桁に丸める
string result1 = string.Format("{0:F2}", value);
Console.WriteLine(result1); // 出力: 123.46
// F指定子で小数点以下4桁
string result2 = string.Format("{0:F4}", value);
Console.WriteLine(result2); // 出力: 123.4568
// 0パターンで小数点以下3桁(必ず3桁表示)
string result3 = string.Format("{0:0.000}", value);
Console.WriteLine(result3); // 出力: 123.457
// #パターンで不要なゼロを省略
double value2 = 123.5;
string result4 = string.Format("{0:0.###}", value2);
Console.WriteLine(result4); // 出力: 123.5
// 整数部のゼロ埋めと小数部の組み合わせ
double value3 = 7.89;
string result5 = string.Format("{0:000.00}", value3);
Console.WriteLine(result5); // 出力: 007.89
「0」パターンと「#」パターンの違いは、「0」は指定した桁が必ず表示される(不足分はゼロで埋められる)のに対し、「#」は意味のある数字のみを表示する点にあります。用途に応じて使い分けることで、より適切な表示形式を実現できます。
3桁区切りのカンマ表示
大きな数値を扱う場合、3桁ごとにカンマで区切ることで可読性が大幅に向上します。金額や人口、データ量などを表示する際には、この3桁区切り表示が標準的な書式として広く使われています。
C#のString.Formatで3桁区切りのカンマを表示するには、「N」指定子または「#,##0」パターンを使用します。以下のコードで実装方法を確認しましょう。
int population = 1234567890;
// N指定子を使用(デフォルトで小数点以下2桁も表示)
string result1 = string.Format("{0:N}", population);
Console.WriteLine(result1); // 出力: 1,234,567,890.00
// N0で小数点以下を表示しない
string result2 = string.Format("{0:N0}", population);
Console.WriteLine(result2); // 出力: 1,234,567,890
// カスタムパターンでカンマ区切り
string result3 = string.Format("{0:#,##0}", population);
Console.WriteLine(result3); // 出力: 1,234,567,890
// 小数点以下も含めたカンマ区切り
double amount = 9876543.21;
string result4 = string.Format("{0:#,##0.00}", amount);
Console.WriteLine(result4); // 出力: 9,876,543.21
// 小数点以下の桁数を動的に指定
string result5 = string.Format("{0:N3}", amount);
Console.WriteLine(result5); // 出力: 9,876,543.210
カンマ区切りの表示は国や地域によって異なる場合があります。日本や米国では3桁ごとのカンマが一般的ですが、一部の国では異なる区切り文字やルールが使用されることもあります。グローバルなアプリケーションを開発する場合は、カルチャ設定を考慮する必要があります。
整数型と浮動小数点型の書式設定
整数型(int、long等)と浮動小数点型(float、double、decimal等)では、使用できる書式指定子や動作が異なる場合があります。データ型の特性を理解した上で適切な書式指定を行うことが、エラーを回避し正確な出力を得るために重要です。
以下の表に、整数型と浮動小数点型で使用できる主な書式指定子をまとめました。
| 書式指定子 | 整数型 | 浮動小数点型 | 説明 |
|---|---|---|---|
| D | ○ | × | 10進数(整数のみ) |
| F | ○ | ○ | 固定小数点 |
| N | ○ | ○ | 数値(カンマ区切り) |
| E | ○ | ○ | 指数表記 |
| X | ○ | × | 16進数(整数のみ) |
実際のコード例で、データ型による書式設定の違いを確認しましょう。
// 整数型の書式設定
int intValue = 12345;
Console.WriteLine(string.Format("{0:D8}", intValue)); // 出力: 00012345
Console.WriteLine(string.Format("{0:N0}", intValue)); // 出力: 12,345
Console.WriteLine(string.Format("{0:X}", intValue)); // 出力: 3039
// 浮動小数点型の書式設定
double doubleValue = 12345.6789;
Console.WriteLine(string.Format("{0:F2}", doubleValue)); // 出力: 12345.68
Console.WriteLine(string.Format("{0:N2}", doubleValue)); // 出力: 12,345.68
Console.WriteLine(string.Format("{0:E2}", doubleValue)); // 出力: 1.23E+004
// decimal型(高精度な金額計算用)
decimal decimalValue = 12345.6789m;
Console.WriteLine(string.Format("{0:F4}", decimalValue)); // 出力: 12345.6789
Console.WriteLine(string.Format("{0:C}", decimalValue)); // 出力: ¥12,345.68(環境依存)
// 整数型にF指定子を使った場合
int intValue2 = 100;
Console.WriteLine(string.Format("{0:F2}", intValue2)); // 出力: 100.00
整数型に対してD指定子やX指定子を使うことはできますが、浮動小数点型には使用できません。逆に、整数型に対してF指定子を使用することは可能で、この場合は自動的に小数点以下がゼロとして表示されます。データ型に適した書式指定子を選択することで、意図しない実行時エラーを防ぐことができます。
また、金額計算など高精度が求められる場合は、decimal型の使用が推奨されます。decimal型はdoubleやfloat型と比べて精度が高く、丸め誤差が発生しにくいため、財務計算に適しています。String.Formatでの書式設定方法は他の数値型と同様ですが、型の特性を理解して使い分けることが重要です。
通貨とパーセント表示

C#のString.Formatメソッドでは、通貨やパーセントといった特定の形式での数値表示が簡単に実現できます。ビジネスアプリケーションや財務システムでは、金額を通貨記号付きで表示したり、割合をパーセント形式で表現したりする必要が頻繁に発生します。C#はこれらの要件に対応するための標準書式指定子を提供しており、コードを簡潔に保ちながら適切な表示形式を実現できます。
通貨記号(¥マーク)を付けて表示する方法
通貨形式で数値を表示するには、書式指定子「C」または「c」を使用します。この書式指定子を使うと、システムのカルチャ設定に応じた通貨記号が自動的に付加され、3桁ごとのカンマ区切りや小数点以下の桁数も適切に設定されます。
基本的な使用例は以下の通りです。
int price = 12345;
string result = String.Format("{0:C}", price);
Console.WriteLine(result); // 出力: ¥12,345日本語環境では通貨記号として「¥」が表示されますが、英語環境では「$」、ユーロ圏では「€」のように、実行環境のカルチャに応じて適切な通貨記号が自動選択されます。
小数点以下の桁数を指定したい場合は、書式指定子の後に数値を追加します。
double amount = 9876.5;
string result1 = String.Format("{0:C}", amount); // ¥9,877
string result2 = String.Format("{0:C0}", amount); // ¥9,877(小数点なし)
string result3 = String.Format("{0:C2}", amount); // ¥9,876.50(小数点2桁)注意点として、「C」書式指定子は既定で小数点以下2桁まで表示しますが、日本円のような小数点を使わない通貨の場合は、カルチャ設定により自動的に丸められます。特定のカルチャに依存しない表示が必要な場合は、CultureInfoクラスを併用することで制御できます。
パーセント表示の書式指定
パーセント形式で数値を表示するには、書式指定子「P」または「p」を使用します。この書式指定子は数値を100倍して「%」記号を付加するため、0.25という小数値が「25%」のように表示されます。
基本的な使用方法は次の通りです。
double rate = 0.8532;
string result = String.Format("{0:P}", rate);
Console.WriteLine(result); // 出力: 85.32%「P」書式指定子は、既定で小数点以下2桁まで表示します。この桁数は「C」書式指定子と同様に数値を指定することで変更可能です。
double ratio = 0.12345;
string result1 = String.Format("{0:P}", ratio); // 12.35%(小数点2桁、四捨五入)
string result2 = String.Format("{0:P0}", ratio); // 12%(小数点なし)
string result3 = String.Format("{0:P1}", ratio); // 12.3%(小数点1桁)
string result4 = String.Format("{0:P4}", ratio); // 12.3450%(小数点4桁)複数の数値を組み合わせて表示する実用的な例も見てみましょう。
double targetValue = 1000000;
double actualValue = 856000;
double achievementRate = actualValue / targetValue;
string report = String.Format("目標: {0:C0}、実績: {1:C0}、達成率: {2:P1}",
targetValue, actualValue, achievementRate);
Console.WriteLine(report);
// 出力: 目標: ¥1,000,000、実績: ¥856,000、達成率: 85.6%この例では、通貨形式とパーセント形式を組み合わせることで、ビジネスレポートなどで必要となる見やすい数値表現を実現しています。パーセント表示は分析結果やKPI表示など、さまざまな場面で活用できる重要な書式設定です。
なお、パーセント記号の位置や空白の有無は、カルチャ設定によって異なる場合があります。グローバルなアプリケーションを開発する際は、この点に留意してテストを行うことが推奨されます。
主要な標準書式指定子の使い方

C#のString.Formatメソッドでは、標準書式指定子を使用することで、数値を様々な形式で表現できます。標準書式指定子は1文字のアルファベットで構成され、その後ろに精度指定子(桁数)を付けることができます。ここでは、よく使われる主要な標準書式指定子について、具体的なコード例とともに詳しく解説します。
10進数書式指定子(D)
10進数書式指定子「D」は、整数型の数値を10進数の文字列に変換する際に使用します。精度指定子を指定することで、指定した桁数に満たない場合は左側にゼロを埋めることができます。この書式指定子は整数型専用であり、浮動小数点型には使用できない点に注意が必要です。
int number = 123;
// 基本的な使い方
string result1 = String.Format("{0:D}", number);
// 結果: "123"
// 5桁でゼロ埋め
string result2 = String.Format("{0:D5}", number);
// 結果: "00123"
// 負の数の場合
int negativeNumber = -45;
string result3 = String.Format("{0:D6}", negativeNumber);
// 結果: "-000045"
D書式指定子は、IDや注文番号など、一定の桁数で揃えたい数値の表示に特に有効です。
固定小数点書式指定子(F)
固定小数点書式指定子「F」は、数値を固定小数点表記で表示する際に使用します。精度指定子を省略した場合、デフォルトで小数点以下2桁まで表示されます。整数型・浮動小数点型の両方に使用可能で、四捨五入が自動的に行われます。
double value = 123.456789;
// デフォルト(小数点以下2桁)
string result1 = String.Format("{0:F}", value);
// 結果: "123.46"
// 小数点以下4桁
string result2 = String.Format("{0:F4}", value);
// 結果: "123.4568"
// 小数点以下0桁(整数部分のみ)
string result3 = String.Format("{0:F0}", value);
// 結果: "123"
// 整数に対して使用
int intValue = 100;
string result4 = String.Format("{0:F2}", intValue);
// 結果: "100.00"
F書式指定子は、金額や測定値など、常に一定の小数桁数で表示したい場合に適しています。
数値書式指定子(N)
数値書式指定子「N」は、3桁ごとにカンマ区切りを含む数値形式で表示します。F書式指定子と同様に、精度指定子を省略すると小数点以下2桁まで表示されます。大きな数値を読みやすく表示する際に非常に便利です。
double largeNumber = 1234567.89;
// デフォルト(小数点以下2桁、カンマ区切り)
string result1 = String.Format("{0:N}", largeNumber);
// 結果: "1,234,567.89"
// 小数点以下0桁
string result2 = String.Format("{0:N0}", largeNumber);
// 結果: "1,234,568"
// 小数点以下3桁
string result3 = String.Format("{0:N3}", largeNumber);
// 結果: "1,234,567.890"
// 小さい数値でも使用可能
int smallNumber = 100;
string result4 = String.Format("{0:N}", smallNumber);
// 結果: "100.00"
N書式指定子は、統計データや財務報告など、数値の視認性を高めたい場合に最適です。
指数書式指定子(E)
指数書式指定子「E」は、数値を指数表記(科学的記数法)で表示します。大文字の「E」を使用すると指数部が大文字の「E」で、小文字の「e」を使用すると小文字の「e」で表示されます。精度指定子は小数点以下の桁数を指定し、デフォルトは6桁です。
double scientificNumber = 1234.5678;
// 大文字E(デフォルト6桁)
string result1 = String.Format("{0:E}", scientificNumber);
// 結果: "1.234568E+003"
// 小文字e
string result2 = String.Format("{0:e}", scientificNumber);
// 結果: "1.234568e+003"
// 小数点以下2桁
string result3 = String.Format("{0:E2}", scientificNumber);
// 結果: "1.23E+003"
// 非常に小さい数値
double tinyNumber = 0.00000123;
string result4 = String.Format("{0:E3}", tinyNumber);
// 結果: "1.230E-006"
E書式指定子は、科学計算や非常に大きい/小さい数値を扱う場合に有用です。
16進数書式指定子(X)
16進数書式指定子「X」は、整数型の数値を16進数表記で表示します。大文字の「X」を使用すると16進数の文字が大文字で、小文字の「x」を使用すると小文字で表示されます。精度指定子で最小桁数を指定でき、不足分はゼロで埋められます。
int hexNumber = 255;
// 大文字表記
string result1 = String.Format("{0:X}", hexNumber);
// 結果: "FF"
// 小文字表記
string result2 = String.Format("{0:x}", hexNumber);
// 結果: "ff"
// 4桁でゼロ埋め
string result3 = String.Format("{0:X4}", hexNumber);
// 結果: "00FF"
// 大きな数値
int largeHex = 65535;
string result4 = String.Format("{0:X}", largeHex);
// 結果: "FFFF"
// バイト値の表示
byte byteValue = 10;
string result5 = String.Format("{0:X2}", byteValue);
// 結果: "0A"
X書式指定子は、カラーコード、メモリアドレス、バイトデータなど、16進数での表現が必要な場合に活用されます。
バイナリ書式指定子(B)
バイナリ書式指定子「B」は、.NET 8以降で導入された新しい標準書式指定子で、整数型の数値を2進数表記で表示します。この機能により、従来のカスタム変換を行わずとも簡単にバイナリ表現を得ることができます。
int binaryNumber = 15;
// 基本的な2進数表記(.NET 8以降)
string result1 = String.Format("{0:B}", binaryNumber);
// 結果: "1111"
// 8桁でゼロ埋め
string result2 = String.Format("{0:B8}", binaryNumber);
// 結果: "00001111"
// 16桁でゼロ埋め
int largerNumber = 255;
string result3 = String.Format("{0:B16}", largerNumber);
// 結果: "0000000011111111"
// ビット演算の結果表示
int bitwiseResult = 0b1010 & 0b1100;
string result4 = String.Format("{0:B4}", bitwiseResult);
// 結果: "1000"
バイナリ書式指定子は.NET 8以降でのみ使用可能であり、それ以前のバージョンでは使用できません。ビット演算の結果確認やデバッグ、低レベルプログラミングでのデータ表現に特に有効です。古いバージョンの.NETを使用している場合は、Convert.ToString(number, 2)などの代替手段を使用する必要があります。
日時データの書式指定

C#のString.Formatメソッドでは、DateTimeオブジェクトを様々な形式で文字列に変換することができます。日時データは業務アプリケーションにおいて頻繁に扱われるデータ型であり、ユーザーに分かりやすい形式で表示することが重要です。ここでは、日付や時刻を適切にフォーマットする方法について解説します。
日付と時刻の標準書式設定
C#では、DateTimeオブジェクトに対して標準書式指定子を使用することで、一般的な日時表示パターンを簡単に適用できます。標準書式指定子は1文字のアルファベットで表され、それぞれが定義済みの書式パターンに対応しています。
基本的な使用方法は以下の通りです。
DateTime now = DateTime.Now;
string formatted = String.Format("{0:d}", now);
// 結果例: 2024/01/15
主要な標準書式指定子とその出力例を以下の表にまとめました。
| 書式指定子 | 説明 | 出力例 |
|---|---|---|
| d | 短い形式の日付 | 2024/01/15 |
| D | 長い形式の日付 | 2024年1月15日 |
| t | 短い形式の時刻 | 14:30 |
| T | 長い形式の時刻 | 14:30:45 |
| f | 完全な日時(短い形式の時刻) | 2024年1月15日 14:30 |
| F | 完全な日時(長い形式の時刻) | 2024年1月15日 14:30:45 |
| g | 一般的な日時(短い形式) | 2024/01/15 14:30 |
| G | 一般的な日時(長い形式) | 2024/01/15 14:30:45 |
| M または m | 月日パターン | 1月15日 |
| Y または y | 年月パターン | 2024年1月 |
実際のコード例を見てみましょう。
DateTime appointmentDate = new DateTime(2024, 3, 25, 14, 30, 0);
// 各種標準書式指定子の使用例
string shortDate = String.Format("予約日: {0:d}", appointmentDate);
// 結果: 予約日: 2024/03/25
string longDate = String.Format("予約日: {0:D}", appointmentDate);
// 結果: 予約日: 2024年3月25日
string shortTime = String.Format("開始時刻: {0:t}", appointmentDate);
// 結果: 開始時刻: 14:30
string fullDateTime = String.Format("予約情報: {0:F}", appointmentDate);
// 結果: 予約情報: 2024年3月25日 14:30:00
string generalDateTime = String.Format("受付日時: {0:g}", appointmentDate);
// 結果: 受付日時: 2024/03/25 14:30
標準書式指定子を使用する利点は、コードが簡潔になることと、カルチャ設定に応じて自動的に適切な表示形式が選択されることです。例えば、英語圏のカルチャでは日付が「3/25/2024」のように月/日/年の順序で表示されますが、日本語カルチャでは「2024/03/25」のように年/月/日の順序で表示されます。
さらに細かい制御が必要な場合は、カスタム書式指定文字列を組み合わせて使用することもできます。
DateTime eventDate = new DateTime(2024, 12, 31, 23, 59, 59);
// カスタム書式の例
string custom1 = String.Format("{0:yyyy年MM月dd日(ddd)}", eventDate);
// 結果: 2024年12月31日(火)
string custom2 = String.Format("{0:HH時mm分ss秒}", eventDate);
// 結果: 23時59分59秒
string custom3 = String.Format("{0:yyyy-MM-dd HH:mm:ss}", eventDate);
// 結果: 2024-12-31 23:59:59
業務システムにおいては、ログ出力やデータベースへの記録時に「yyyy-MM-dd HH:mm:ss」形式を使用することが多く、ユーザー向けの画面表示では「yyyy年MM月dd日」のような読みやすい形式を使用するのが一般的です。用途に応じて適切な書式指定子を選択することで、可読性の高いコードを実現できます。
文字列の連結と挿入

C#のString.Formatメソッドは、単純な書式指定だけでなく、複数の文字列を効率的に連結し、配置を制御する強力な機能を備えています。このセクションでは、文字列の連結と挿入に関する実践的な手法を詳しく解説します。
複数の文字列を連結する方法
String.Formatメソッドを使用することで、複数の文字列や変数を読みやすく、かつ効率的に連結できます。従来の「+」演算子による連結と比較して、コードの可読性が高く、メンテナンス性に優れている点が大きなメリットです。
基本的な文字列連結の構文は以下の通りです。
string firstName = "太郎";
string lastName = "山田";
string result = string.Format("{0} {1}", lastName, firstName);
// 結果: "山田 太郎"
この方法では、プレースホルダー({0}、{1}など)を使用して、引数の位置を指定します。同じ引数を複数回使用することも可能です。
string name = "田中";
string message = string.Format("こんにちは、{0}さん。{0}さんの登録が完了しました。", name);
// 結果: "こんにちは、田中さん。田中さんの登録が完了しました。"
複数の異なるデータ型を連結する場合も、String.Formatメソッドは自動的に各オブジェクトの文字列表現を取得します。
string productName = "ノートPC";
int quantity = 3;
decimal price = 98000.50m;
string order = string.Format("商品名: {0}, 数量: {1}, 単価: {2}円", productName, quantity, price);
// 結果: "商品名: ノートPC, 数量: 3, 単価: 98000.50円"
また、C# 6.0以降では補間文字列(interpolated strings)を使用することで、より直感的な記述が可能です。
string userName = "佐藤";
int points = 1500;
string info = $"ユーザー名: {userName}, ポイント: {points}";
// 結果: "ユーザー名: 佐藤, ポイント: 1500"
配置と間隔の制御方法
String.Formatメソッドでは、単に文字列を連結するだけでなく、出力される文字列の配置や間隔を細かく制御できます。この機能により、整列されたレポートやテーブル形式のデータ表示が容易に実現できます。
配置の制御には、プレースホルダー内でコンマ(,)の後に整列幅を指定します。基本構文は次の通りです。
{インデックス,整列幅:書式指定子}
正の値を指定すると右揃え、負の値を指定すると左揃えになります。具体例を見てみましょう。
// 右揃え(整列幅10文字)
string right = string.Format("|{0,10}|", "C#");
// 結果: "| C#|"
// 左揃え(整列幅10文字)
string left = string.Format("|{0,-10}|", "C#");
// 結果: "|C# |"
この機能は、複数のデータを表形式で整列させる際に特に有効です。
string header = string.Format("{0,-15}{1,10}{2,12}", "商品名", "数量", "金額");
string item1 = string.Format("{0,-15}{1,10}{2,12}", "キーボード", 5, 15000);
string item2 = string.Format("{0,-15}{1,10}{2,12}", "マウス", 10, 8000);
string item3 = string.Format("{0,-15}{1,10}{2,12}", "モニター", 2, 60000);
Console.WriteLine(header);
Console.WriteLine(item1);
Console.WriteLine(item2);
Console.WriteLine(item3);
/* 結果:
商品名 数量 金額
キーボード 5 15000
マウス 10 8000
モニター 2 60000
*/
配置指定と書式指定子を組み合わせることで、さらに高度な制御が可能になります。
decimal amount1 = 1234.5m;
decimal amount2 = 56.78m;
decimal amount3 = 9012.345m;
string formatted = string.Format("{0,15:N2}\n{1,15:N2}\n{2,15:N2}",
amount1, amount2, amount3);
Console.WriteLine(formatted);
/* 結果:
1,234.50
56.78
9,012.35
*/
上記の例では、15文字幅で右揃えし、小数点以下2桁の数値書式(N2)を適用しています。このように、配置制御と書式指定を同時に使用することで、読みやすく整形されたデータ表示が実現できます。
複雑なレポート生成の例を見てみましょう。
string reportHeader = string.Format("{0,-12}{1,10}{2,12}{3,15}",
"部門", "人数", "売上", "達成率");
string divisionA = string.Format("{0,-12}{1,10}{2,12:C0}{3,15:P1}",
"営業部", 25, 15000000, 1.05);
string divisionB = string.Format("{0,-12}{1,10}{2,12:C0}{3,15:P1}",
"開発部", 40, 8000000, 0.85);
Console.WriteLine(reportHeader);
Console.WriteLine(divisionA);
Console.WriteLine(divisionB);
/* 結果:
部門 人数 売上 達成率
営業部 25 ¥15,000,000 105.0%
開発部 40 ¥8,000,000 85.0%
*/
このように、String.Formatメソッドの配置制御機能を活用することで、プログラム内で簡潔かつ視覚的に分かりやすいテキスト出力が可能になります。
“`html
カルチャとロケールへの対応

C#のString.Formatメソッドは、グローバルなアプリケーション開発において重要な機能である、カルチャ(文化圏)やロケール(地域設定)に応じた書式設定に対応しています。同じ数値や日付であっても、国や地域によって表示形式が異なるため、適切なカルチャ設定を行うことで、ユーザーの地域に最適化された表示が可能になります。
カルチャに応じた書式設定の調整
String.Formatメソッドでは、IFormatProviderインターフェースを実装したCultureInfoクラスを使用することで、特定のカルチャに応じた書式設定を適用できます。これにより、数値の小数点記号、桁区切り記号、通貨記号、日付形式などを自動的に調整できます。
基本的な使い方として、String.Formatメソッドの第一引数にCultureInfoオブジェクトを指定します。以下は具体的なコード例です。
using System;
using System.Globalization;
double price = 1234.56;
// 日本のカルチャ設定
string jpFormat = String.Format(new CultureInfo("ja-JP"), "{0:C}", price);
Console.WriteLine(jpFormat); // ¥1,235
// アメリカのカルチャ設定
string usFormat = String.Format(new CultureInfo("en-US"), "{0:C}", price);
Console.WriteLine(usFormat); // $1,234.56
// ドイツのカルチャ設定
string deFormat = String.Format(new CultureInfo("de-DE"), "{0:C}", price);
Console.WriteLine(deFormat); // 1.234,56 €
// フランスのカルチャ設定
string frFormat = String.Format(new CultureInfo("fr-FR"), "{0:C}", price);
Console.WriteLine(frFormat); // 1 234,56 €
上記の例では、同じ数値1234.56が各カルチャに応じて異なる形式で表示されています。日本では円記号とカンマ区切り、アメリカではドル記号とピリオドの小数点、ドイツやフランスではピリオドとカンマの使い方が逆転するなど、地域特有の表記規則が自動的に適用されます。
日付のフォーマットにおいてもカルチャ設定は重要です。
DateTime date = new DateTime(2024, 3, 15);
// 日本形式
string jpDate = String.Format(new CultureInfo("ja-JP"), "{0:D}", date);
Console.WriteLine(jpDate); // 2024年3月15日
// アメリカ形式
string usDate = String.Format(new CultureInfo("en-US"), "{0:D}", date);
Console.WriteLine(usDate); // Friday, March 15, 2024
// イギリス形式
string gbDate = String.Format(new CultureInfo("en-GB"), "{0:d}", date);
Console.WriteLine(gbDate); // 15/03/2024
カルチャを指定しない場合は、システムのデフォルトカルチャ(CultureInfo.CurrentCulture)が使用されるため、実行環境によって出力結果が異なる可能性があります。アプリケーションの動作を一貫させたい場合は、明示的にカルチャを指定することが推奨されます。
NumberFormatInfoプロパティの活用
より細かい制御が必要な場合は、NumberFormatInfoクラスを使用して数値の書式設定を詳細にカスタマイズできます。NumberFormatInfoは、数値表示に関するあらゆる設定を保持するクラスで、小数点記号、桁区切り記号、マイナス記号、通貨記号など、数値フォーマットに関するすべての要素を個別に制御できます。
以下は、NumberFormatInfoを使用したカスタマイズの例です。
using System;
using System.Globalization;
double value = 1234567.89;
// カスタムNumberFormatInfoの作成
NumberFormatInfo customFormat = new NumberFormatInfo();
customFormat.NumberDecimalSeparator = ","; // 小数点記号をカンマに
customFormat.NumberGroupSeparator = " "; // 桁区切りをスペースに
customFormat.NumberGroupSizes = new int[] { 3 }; // 3桁ごとに区切る
customFormat.NumberDecimalDigits = 2; // 小数点以下2桁
string result = String.Format(customFormat, "{0:N}", value);
Console.WriteLine(result); // 1 234 567,89
通貨フォーマットについても同様に詳細な設定が可能です。
NumberFormatInfo currencyFormat = new NumberFormatInfo();
currencyFormat.CurrencySymbol = "USD"; // 通貨記号
currencyFormat.CurrencyDecimalSeparator = "."; // 小数点記号
currencyFormat.CurrencyGroupSeparator = ","; // 桁区切り記号
currencyFormat.CurrencyDecimalDigits = 2; // 小数点以下の桁数
currencyFormat.CurrencyPositivePattern = 1; // 正の値のパターン (1は数値$の形式)
double amount = 9876.54;
string formatted = String.Format(currencyFormat, "{0:C}", amount);
Console.WriteLine(formatted); // 9,876.54USD
NumberFormatInfoの主要なプロパティには以下のようなものがあります。
| プロパティ名 | 説明 | デフォルト例(en-US) |
|---|---|---|
| NumberDecimalSeparator | 数値の小数点記号 | “.” |
| NumberGroupSeparator | 数値の桁区切り記号 | “,” |
| CurrencySymbol | 通貨記号 | “$” |
| CurrencyDecimalSeparator | 通貨の小数点記号 | “.” |
| CurrencyGroupSeparator | 通貨の桁区切り記号 | “,” |
| PercentSymbol | パーセント記号 | “%” |
| NegativeSign | マイナス記号 | “-“ |
既存のCultureInfoからNumberFormatInfoを取得し、一部のプロパティだけを変更することもできます。
CultureInfo culture = new CultureInfo("ja-JP");
NumberFormatInfo numberFormat = (NumberFormatInfo)culture.NumberFormat.Clone();
// 日本円の通貨記号をカスタマイズ
numberFormat.CurrencySymbol = "円";
double price = 5000;
string output = String.Format(numberFormat, "{0:C0}", price);
Console.WriteLine(output); // 5,000円
デフォルトのNumberFormatInfoは読み取り専用のため、Clone()メソッドで複製してから変更する必要があります。この方法により、既存のカルチャ設定を基礎としながら、必要な部分だけをカスタマイズできます。
実際の国際化対応アプリケーションでは、ユーザーの言語設定や地域設定を取得し、適切なCultureInfoやNumberFormatInfoを動的に適用することで、世界中のユーザーに最適な表示を提供できます。
“`
カスタム書式設定の実装

C#のstring formatでは、標準の書式指定子だけでなく、独自の書式設定ロジックを実装することができます。カスタム書式設定を使用することで、業務要件に応じた柔軟な文字列表現が可能になります。IFormatProviderやICustomFormatterインターフェースを実装することで、特殊な表示形式や独自のフォーマットルールを適用できるようになります。
独自フォーマッタの作成方法
独自のフォーマッタを作成するには、ICustomFormatterとIFormatProviderの2つのインターフェースを実装する必要があります。ICustomFormatterインターフェースはFormatメソッドを持ち、実際の書式変換処理を定義します。一方、IFormatProviderは書式設定サービスを提供するための仕組みです。
基本的な実装手順は以下の通りです:
- IFormatProviderインターフェースを実装したクラスを作成
- ICustomFormatterインターフェースを実装したクラスを作成
- Formatメソッド内でカスタムロジックを記述
- String.Formatメソッドの引数にカスタムフォーマッタを渡す
public class CustomFormatter : IFormatProvider, ICustomFormatter
{
// IFormatProviderの実装
public object GetFormat(Type formatType)
{
if (formatType == typeof(ICustomFormatter))
return this;
return null;
}
// ICustomFormatterの実装
public string Format(string format, object arg, IFormatProvider formatProvider)
{
// デフォルトの書式処理が必要な場合
if (arg == null || format == null)
{
if (arg is IFormattable formattable)
return formattable.ToString(format, formatProvider);
return arg?.ToString() ?? string.Empty;
}
// カスタム書式の処理をここに記述
// formatパラメータに基づいて独自の変換を実装
return arg.ToString();
}
}このクラスを使用する際は、String.Formatメソッドの第1引数にカスタムフォーマッタのインスタンスを渡します。これにより、書式指定文字列内の全てのプレースホルダーがカスタムフォーマッタで処理されるようになります。
カスタム書式設定の具体例
実務でよく使用されるカスタム書式設定の具体例をいくつか紹介します。これらの例を参考にすることで、さまざまなビジネス要件に対応した書式設定が実装できます。
電話番号フォーマッタの実装例:
public class PhoneNumberFormatter : IFormatProvider, ICustomFormatter
{
public object GetFormat(Type formatType)
{
return formatType == typeof(ICustomFormatter) ? this : null;
}
public string Format(string format, object arg, IFormatProvider formatProvider)
{
if (arg == null) return string.Empty;
string value = arg.ToString();
// "TEL"書式の場合、電話番号形式で表示
if (format == "TEL" && value.Length == 10)
{
return $"{value.Substring(0, 3)}-{value.Substring(3, 4)}-{value.Substring(7)}";
}
else if (format == "TEL" && value.Length == 11)
{
return $"{value.Substring(0, 3)}-{value.Substring(3, 4)}-{value.Substring(7)}";
}
// デフォルトの書式処理
if (arg is IFormattable formattable)
return formattable.ToString(format, formatProvider);
return value;
}
}
// 使用例
var formatter = new PhoneNumberFormatter();
string result = string.Format(formatter, "{0:TEL}", "0312345678");
// 出力: 03-1234-5678ファイルサイズフォーマッタの実装例:
public class FileSizeFormatter : IFormatProvider, ICustomFormatter
{
public object GetFormat(Type formatType)
{
return formatType == typeof(ICustomFormatter) ? this : null;
}
public string Format(string format, object arg, IFormatProvider formatProvider)
{
if (arg == null || !(arg is long || arg is int))
return arg?.ToString() ?? string.Empty;
long bytes = Convert.ToInt64(arg);
if (format == "FS") // FileSize書式
{
string[] sizes = { "B", "KB", "MB", "GB", "TB" };
double len = bytes;
int order = 0;
while (len >= 1024 && order sizes.Length - 1)
{
order++;
len = len / 1024;
}
return $"{len:0.##} {sizes[order]}";
}
if (arg is IFormattable formattable)
return formattable.ToString(format, formatProvider);
return arg.ToString();
}
}
// 使用例
var formatter = new FileSizeFormatter();
string result = string.Format(formatter, "ファイルサイズ: {0:FS}", 1536000);
// 出力: ファイルサイズ: 1.46 MBマスキングフォーマッタの実装例:
public class MaskingFormatter : IFormatProvider, ICustomFormatter
{
public object GetFormat(Type formatType)
{
return formatType == typeof(ICustomFormatter) ? this : null;
}
public string Format(string format, object arg, IFormatProvider formatProvider)
{
if (arg == null) return string.Empty;
string value = arg.ToString();
// "MASK"書式の場合、一部をマスキング
if (format == "MASK" && value.Length >= 4)
{
int visibleCount = 2;
string masked = new string('*', value.Length - visibleCount * 2);
return value.Substring(0, visibleCount) + masked + value.Substring(value.Length - visibleCount);
}
if (arg is IFormattable formattable)
return formattable.ToString(format, formatProvider);
return value;
}
}
// 使用例
var formatter = new MaskingFormatter();
string result = string.Format(formatter, "カード番号: {0:MASK}", "1234567890123456");
// 出力: カード番号: 12************56これらの実装例では、特定の書式指定文字列(”TEL”、”FS”、”MASK”など)に応じて独自の変換処理を行っています。formatパラメータの値を判定し、条件に合致する場合は独自のロジックを適用し、それ以外はデフォルトの書式処理に委譲する構造になっています。
カスタムフォーマッタを作成する際の注意点として、以下の点に留意する必要があります:
- null値の処理を適切に行うこと
- 想定外の型が渡された場合のフォールバック処理を実装すること
- デフォルトの書式処理への委譲を忘れないこと
- パフォーマンスを考慮した実装にすること
- 再利用可能な設計を心がけること
カスタムフォーマッタは強力な機能ですが、複雑になりすぎると保守性が低下するため、シンプルで明確なロジックを保つことが重要です。また、同じ書式設定を複数箇所で使用する場合は、クラスライブラリとして整理し、プロジェクト全体で共有できるようにすると効率的です。
実践的なコード例とサンプル集

ここまで学んできたString.Formatメソッドの書式指定を組み合わせた、実務で役立つ実践的なコード例を紹介します。これらのサンプルは実際の開発現場でよく使われるパターンをまとめたものです。コピー&ペーストして、すぐにプロジェクトで活用できる内容となっています。
売上レポートのフォーマット例
売上データを見やすく整形する際に役立つコード例です。数値の桁揃えや通貨表示を組み合わせることで、プロフェッショナルな表示が可能になります。
// 売上レポートの出力例
string productName = "商品A";
int quantity = 150;
decimal unitPrice = 1280.50m;
decimal totalAmount = quantity * unitPrice;
string report = string.Format(
"商品名: {0,-20} 数量: {1,5:N0}個 単価: {2,10:C} 合計: {3,12:C}",
productName, quantity, unitPrice, totalAmount
);
Console.WriteLine(report);
// 出力: 商品名: 商品A 数量: 150個 単価: ¥1,281 合計: ¥192,075
このコードでは、配置指定と書式指定を同時に使用することで、表形式のような整った出力を実現しています。負の値は左寄せ、正の値は右寄せを指定しています。
ログ出力のタイムスタンプ付き記録
アプリケーションのログ記録で頻繁に使用されるタイムスタンプ付きメッセージの生成例です。日時と文字列を組み合わせた実用的なパターンを示します。
// ログメッセージの生成
DateTime now = DateTime.Now;
string logLevel = "ERROR";
string message = "データベース接続に失敗しました";
int errorCode = 1042;
string logEntry = string.Format(
"[{0:yyyy-MM-dd HH:mm:ss.fff}] [{1,-5}] {2} (Code: {3:D4})",
now, logLevel, message, errorCode
);
Console.WriteLine(logEntry);
// 出力: [2024-01-15 14:30:45.123] [ERROR] データベース接続に失敗しました (Code: 1042)
ログレベルは5文字で左寄せに統一し、エラーコードは4桁のゼロ埋め表示にすることで、ログファイルの可読性が大幅に向上します。
進捗状況の表示
プログレスバーやダウンロード進捗など、処理の進行状況を表示する際に役立つコード例です。パーセント表示と組み合わせることで直感的な情報提供が可能です。
// 進捗表示の生成
int processedItems = 75;
int totalItems = 200;
double progress = (double)processedItems / totalItems;
TimeSpan elapsedTime = TimeSpan.FromSeconds(45);
string progressMessage = string.Format(
"処理中... {0}/{1} ({2:P1}) - 経過時間: {3:mm\\:ss}",
processedItems, totalItems, progress, elapsedTime
);
Console.WriteLine(progressMessage);
// 出力: 処理中... 75/200 (37.5%) - 経過時間: 00:45
パーセント表示には精度指定子を使用して小数点以下1桁まで表示し、時間は分秒形式で見やすく整形しています。
テーブル形式のデータ表示
複数行にわたるデータを表形式で整列させる実用例です。ヘッダーとデータ行の桁を揃えることで、コンソール上でも美しい表を実現できます。
// テーブル形式の出力
string header = string.Format("{0,-10} {1,8} {2,12} {3,10}",
"ID", "数量", "単価", "小計");
string separator = new string('-', 42);
Console.WriteLine(header);
Console.WriteLine(separator);
// データ行の出力
var items = new[]
{
new { Id = "P001", Qty = 5, Price = 1200.00m },
new { Id = "P002", Qty = 12, Price = 850.50m },
new { Id = "P003", Qty = 3, Price = 3500.00m }
};
foreach (var item in items)
{
string row = string.Format("{0,-10} {1,8:N0} {2,12:C} {3,10:C}",
item.Id, item.Qty, item.Price, item.Qty * item.Price);
Console.WriteLine(row);
}
// 出力:
// ID 数量 単価 小計
// ------------------------------------------
// P001 5 ¥1,200 ¥6,000
// P002 12 ¥851 ¥10,206
// P003 3 ¥3,500 ¥10,500
このコードでは、各カラムの幅を統一することで、データが整然と並んだ見やすい表を作成しています。
エラーメッセージのフォーマット
例外処理やバリデーションエラーなど、ユーザーに分かりやすいエラーメッセージを生成する例です。情報を構造化して提示することで、問題の特定が容易になります。
// 詳細なエラーメッセージの生成
string fieldName = "メールアドレス";
string inputValue = "invalid-email";
int maxLength = 100;
int actualLength = inputValue.Length;
string errorMessage = string.Format(
"入力エラー: {0}\n" +
" 入力値: '{1}'\n" +
" 最大長: {2}文字 (現在: {3}文字)\n" +
" エラーコード: {4:X8}",
fieldName, inputValue, maxLength, actualLength, 0xE0001001
);
Console.WriteLine(errorMessage);
// 出力:
// 入力エラー: メールアドレス
// 入力値: 'invalid-email'
// 最大長: 100文字 (現在: 13文字)
// エラーコード: E0001001
エラーコードは16進数表示にすることで、技術的な識別子として機能させています。
ファイルサイズの人間読みやすい表示
バイト数を自動的に適切な単位(KB、MB、GB)で表示する実用的なコード例です。ファイル管理やストレージ情報の表示に活用できます。
// ファイルサイズの表示
long[] fileSizes = { 1024, 1048576, 1073741824, 1234567890 };
foreach (long size in fileSizes)
{
string formattedSize;
if (size 1024)
{
formattedSize = string.Format("{0:N0} B", size);
}
else if (size 1024 * 1024)
{
formattedSize = string.Format("{0:N2} KB", size / 1024.0);
}
else if (size 1024 * 1024 * 1024)
{
formattedSize = string.Format("{0:N2} MB", size / (1024.0 * 1024.0));
}
else
{
formattedSize = string.Format("{0:N2} GB", size / (1024.0 * 1024.0 * 1024.0));
}
Console.WriteLine(string.Format("サイズ: {0,12}", formattedSize));
}
// 出力:
// サイズ: 1,024 B
// サイズ: 1.00 MB
// サイズ: 1.00 GB
// サイズ: 1.15 GB
このパターンは、数値を人間が理解しやすい形式に変換する典型的な実装例として、様々なシーンで応用できます。
複合条件によるメッセージ生成
条件に応じて動的にメッセージを組み立てる実践例です。ビジネスロジックの結果を分かりやすく表示する際に活用できます。
// 在庫状況メッセージの生成
string productCode = "ABC-123";
int stockQuantity = 5;
int orderQuantity = 10;
bool isBackorderAllowed = true;
string statusMessage;
if (stockQuantity >= orderQuantity)
{
statusMessage = string.Format(
"商品コード: {0} - 即納可能 (在庫: {1}個)",
productCode, stockQuantity
);
}
else if (isBackorderAllowed)
{
int backorderQty = orderQuantity - stockQuantity;
statusMessage = string.Format(
"商品コード: {0} - 一部取り寄せ (在庫: {1}個 / 取り寄せ: {2}個)",
productCode, stockQuantity, backorderQty
);
}
else
{
statusMessage = string.Format(
"商品コード: {0} - 在庫不足 (必要: {1}個 / 在庫: {2}個)",
productCode, orderQuantity, stockQuantity
);
}
Console.WriteLine(statusMessage);
// 出力: 商品コード: ABC-123 - 一部取り寄せ (在庫: 5個 / 取り寄せ: 5個)
条件分岐とString.Formatを組み合わせることで、状況に応じた適切なメッセージを柔軟に生成できます。
パフォーマンス測定結果の表示
処理速度やベンチマーク結果を見やすく表示する例です。開発時のパフォーマンスチューニングに役立ちます。
// パフォーマンス測定結果の表示
string operationName = "データベースクエリ";
int iterations = 1000;
double totalMilliseconds = 2345.678;
double averageMs = totalMilliseconds / iterations;
double operationsPerSecond = 1000.0 / averageMs;
string performanceReport = string.Format(
"【{0}】\n" +
" 実行回数: {1,10:N0}回\n" +
" 総実行時間: {2,10:N3}ms\n" +
" 平均実行時間: {3,10:N3}ms\n" +
" スループット: {4,10:N2}ops/sec",
operationName, iterations, totalMilliseconds, averageMs, operationsPerSecond
);
Console.WriteLine(performanceReport);
// 出力:
// 【データベースクエリ】
// 実行回数: 1,000回
// 総実行時間: 2,345.678ms
// 平均実行時間: 2.346ms
// スループット: 426.23ops/sec
数値の精度を適切に指定し、右寄せで桁を揃えることで、複数の測定結果を比較しやすいレポートが作成できます。これらのサンプルコードを基に、プロジェクトの要件に合わせてカスタマイズして活用してください。
まとめ

本記事では、C#のString.Formatメソッドを活用した様々な文字列書式設定の方法について解説してきました。String.Formatは文字列操作における強力なツールであり、プログラミングの現場で頻繁に使用される重要なメソッドです。
基本的な使い方から応用的なテクニックまで、String.Formatメソッドを使いこなすことで、コードの可読性と保守性が大幅に向上します。数値のゼロ埋めや小数点以下の桁数指定、3桁区切りのカンマ表示など、実務で必要となる書式設定はほぼすべて対応可能です。
標準書式指定子(D、F、N、E、X、Bなど)を適切に使い分けることで、様々なデータ型を目的に応じた形式で表示できます。特に通貨やパーセント表示は、ビジネスアプリケーションにおいて必須の機能と言えるでしょう。日時データの書式設定も、標準書式指定子を活用することで簡潔に記述できます。
また、カルチャとロケールへの対応は、グローバルに展開するアプリケーション開発において重要な要素です。NumberFormatInfoプロパティやCultureInfoクラスを組み合わせることで、地域ごとに異なる表示形式に柔軟に対応できます。
さらに高度な要件がある場合は、IFormatProviderやICustomFormatterインターフェースを実装した独自フォーマッタの作成も可能です。これにより、標準では対応していない特殊な書式設定も実現できます。
注意点として、中カッコ({ })を文字列として表示したい場合は、二重にして{{ }}とエスケープする必要があることを忘れないようにしましょう。この点を見落とすと、実行時エラーや予期しない出力結果につながる可能性があります。
String.Formatメソッドは、C# 6.0以降で導入された文字列補間($””)と併用されることも多くなっていますが、動的に書式文字列を構築する必要がある場合や、複雑な書式設定が必要な場面では依然として有用です。状況に応じて適切な方法を選択することが、効率的なコーディングにつながります。
本記事で紹介したテクニックを実践で活用することで、より洗練された文字列処理が可能になります。サンプルコードを参考にしながら、実際のプロジェクトで様々な書式設定を試してみてください。
