C#の書式指定を完全解説|文字列・数値・日付のformat/ToString使い方とよくあるエラー対策

はじめに

C#の書式指定は、数値、日付、時刻、文字列などを「人が読みやすい形」に変換するための重要な機能です。

たとえば、数値の 10001,000 と表示したり、日付の 2026-06-132026年06月13日 と表示したり、IDを 0001 のように0埋めしたりできます。

C#では、主に次の方法で書式指定を行います。

C#
string.Format("{0:N0}", 1000);
1000.ToString("N0");
$"{1000:N0}";

どれも結果は似ていますが、使う場面や書き方には違いがあります。

この記事では、C#の書式指定について、string.FormatToString、文字列補間、数値書式、日付書式、CultureInfo、よくあるエラーまでまとめて解説します。

1. C#の書式指定とは?format/ToStringでできること

1-1. C#における「書式指定」の意味

C#における書式指定とは、値を文字列として表示するときに、表示形式を指定することです。

たとえば、同じ DateTime の値でも、表示方法は複数あります。

C#
DateTime date = new DateTime(2026, 6, 13);

Console.WriteLine(date.ToString("yyyy/MM/dd"));
Console.WriteLine(date.ToString("yyyy年MM月dd日"));
Console.WriteLine(date.ToString("MM-dd"));

出力例は次のようになります。

C#
2026/06/13
2026年06月13日
06-13

値そのものは同じでも、書式指定によって表示結果を変えられます。

C#の書式指定は、画面表示、ログ出力、帳票、CSV、金額表示、日付表示など、さまざまな場面で使われます。

1-2. 文字列・数値・日付を見やすく変換する仕組み

C#では、数値や日付などの値を文字列に変換するとき、書式文字列を使って表示方法を指定できます。

数値の場合は、桁区切り、小数点以下の桁数、通貨、パーセント、0埋めなどを指定できます。

C#
int price = 1000;

Console.WriteLine(price.ToString("N0"));
Console.WriteLine(price.ToString("C"));
Console.WriteLine(price.ToString("D6"));

出力例は次のようになります。

C#
1,000
¥1,000
001000

日付の場合は、年、月、日、時、分、秒、曜日などを指定できます。

C#
DateTime now = new DateTime(2026, 6, 13, 15, 30, 45);

Console.WriteLine(now.ToString("yyyy/MM/dd"));
Console.WriteLine(now.ToString("HH:mm:ss"));
Console.WriteLine(now.ToString("yyyy年MM月dd日 HH時mm分ss秒"));

出力例は次のようになります。

C#
2026/06/13
15:30:45
2026年06月13日 15時30分45秒

このように、書式指定を使うと、データを用途に合わせて見やすく整形できます。

1-3. string.Format・ToString・文字列補間の違い

C#で書式指定を行う代表的な方法は、次の3つです。

C#
string.Format("{0:N0}", value);
value.ToString("N0");
$"{value:N0}";

それぞれの特徴は次のとおりです。

方法特徴
string.Format複数の値をテンプレートに埋め込むときに使いやすい
ToString("書式")1つの値を指定した形式で文字列化するときに使いやすい
文字列補間 $"{}"可読性が高く、現在のC#でよく使われる

たとえば、金額と日付を含むメッセージを作る場合は、次のように書けます。

C#
int price = 1000;
DateTime date = new DateTime(2026, 6, 13);

string message1 = string.Format("金額は{0:N0}円、日付は{1:yyyy/MM/dd}です。", price, date);
string message2 = $"金額は{price:N0}円、日付は{date:yyyy/MM/dd}です。";

Console.WriteLine(message1);
Console.WriteLine(message2);

出力結果は同じです。

C#
金額は1,000円、日付は2026/06/13です。
金額は1,000円、日付は2026/06/13です。

現在のC#では、可読性の面から文字列補間がよく使われます。

1-4. 書式指定が必要になる代表的な場面

C#の書式指定は、次のような場面でよく使われます。

C#
// IDを0埋めする
int id = 1;
Console.WriteLine(id.ToString("D4")); // 0001

// 金額をカンマ区切りで表示する
int price = 1234567;
Console.WriteLine(price.ToString("N0")); // 1,234,567

// 小数を2桁で表示する
double rate = 0.12345;
Console.WriteLine(rate.ToString("P2")); // 12.35%

// 日付を指定形式で表示する
DateTime date = new DateTime(2026, 6, 13);
Console.WriteLine(date.ToString("yyyy年MM月dd日")); // 2026年06月13日

特に、業務アプリケーションでは次のような用途で頻繁に使われます。

用途書式指定の例
伝票番号0001, 0002
金額表示¥1,000, 1,000円
日付表示2026/06/13, 2026年06月13日
ログ出力2026-06-13 15:30:45
CSV出力小数点や日付形式の統一
帳票出力桁揃え、通貨、日付表示

書式指定を理解しておくと、表示処理の品質を高められます。

2. C#で使う書式指定の基本構文

2-1. 複合書式指定の基本:{0}・{1}の使い方

string.Formatでは、文字列の中に {0}{1} のようなプレースホルダーを置き、後ろに指定した値を埋め込みます。

C#
string name = "田中";
int age = 30;

string text = string.Format("名前は{0}、年齢は{1}歳です。", name, age);

Console.WriteLine(text);

出力結果は次のとおりです。

C#
名前は田中、年齢は30歳です。

{0} は1番目の引数、{1} は2番目の引数を表します。

C#
string result = string.Format("{0}さんは{1}点です。", "佐藤", 85);

Console.WriteLine(result);

出力結果は次のようになります。

C#
佐藤さんは85点です。

インデックス番号は0から始まる点に注意しましょう。

2-2. format指定子の基本:{0:書式}の書き方

string.Formatで書式を指定する場合は、次のように書きます。

C#
string.Format("{0:書式}", );

たとえば、数値にカンマ区切りを付ける場合は次のようになります。

C#
int number = 1234567;

string text = string.Format("{0:N0}", number);

Console.WriteLine(text);

出力結果は次のとおりです。

C#
1,234,567

日付の場合も同じように指定できます。

C#
DateTime date = new DateTime(2026, 6, 13);

string text = string.Format("{0:yyyy/MM/dd}", date);

Console.WriteLine(text);

出力結果は次のようになります。

C#
2026/06/13

{0:yyyy/MM/dd} のように、コロンの後ろに書式を指定するのが基本です。

2-3. ToString("書式")の基本構文

ToString("書式")は、対象の値を指定した形式で文字列に変換する方法です。

C#
int number = 1234;

string text = number.ToString("D6");

Console.WriteLine(text);

出力結果は次のとおりです。

C#
001234

日付も同じように指定できます。

C#
DateTime date = new DateTime(2026, 6, 13);

string text = date.ToString("yyyy年MM月dd日");

Console.WriteLine(text);

出力結果は次のようになります。

C#
2026年06月13日

1つの値を整形するだけなら、ToString("書式") はシンプルで使いやすい書き方です。

2-4. 文字列補間で書式指定する方法

文字列補間では、文字列の前に $ を付け、{} の中に変数や式を書きます。

C#
int price = 1000;

string text = $"金額は{price:N0}円です。";

Console.WriteLine(text);

出力結果は次のとおりです。

C#
金額は1,000円です。

日付も同じように書けます。

C#
DateTime date = new DateTime(2026, 6, 13);

string text = $"日付は{date:yyyy/MM/dd}です。";

Console.WriteLine(text);

出力結果は次のようになります。

C#
日付は2026/06/13です。

文字列補間では、{変数:書式} の形で書式指定を行います。

C#
$"{値:書式}"

string.Formatよりも、どの値を埋め込んでいるかが分かりやすいため、現在のC#ではよく使われます。

2-5. 書式指定でよく使うサンプルコード一覧

C#の書式指定でよく使うコードをまとめると、次のようになります。

C#
int number = 1234;
double value = 1234.567;
DateTime date = new DateTime(2026, 6, 13, 15, 30, 45);

Console.WriteLine(number.ToString("D6")); // 001234
Console.WriteLine(number.ToString("N0")); // 1,234
Console.WriteLine(value.ToString("F2")); // 1234.57
Console.WriteLine(value.ToString("N2")); // 1,234.57
Console.WriteLine(0.1234.ToString("P2")); // 12.34%
Console.WriteLine(number.ToString("X")); // 4D2

Console.WriteLine(date.ToString("yyyy/MM/dd")); // 2026/06/13
Console.WriteLine(date.ToString("HH:mm:ss")); // 15:30:45
Console.WriteLine(date.ToString("yyyyMMddHHmmss"));// 20260613153045

文字列補間で書く場合は、次のようになります。

C#
Console.WriteLine($"{number:D6}");
Console.WriteLine($"{number:N0}");
Console.WriteLine($"{value:F2}");
Console.WriteLine($"{date:yyyy/MM/dd}");
Console.WriteLine($"{date:HH:mm:ss}");

この基本構文を押さえておけば、C#の書式指定はかなり扱いやすくなります。

3. C#の文字列書式指定|string.Formatと文字列補間

3-1. string.Formatの基本的な使い方

string.Formatは、テンプレート文字列に値を埋め込むためのメソッドです。

基本形は次のとおりです。

C#
string.Format("文字列 {0}", );

サンプルコードを見てみましょう。

C#
string name = "山田";

string message = string.Format("こんにちは、{0}さん。", name);

Console.WriteLine(message);

出力結果は次のようになります。

C#
こんにちは、山田さん。

{0} の部分に name の値が入ります。

数値や日付にも使えます。

C#
int score = 95;
DateTime date = new DateTime(2026, 6, 13);

string message = string.Format("{0}点を取得しました。日付:{1:yyyy/MM/dd}", score, date);

Console.WriteLine(message);

出力結果は次のとおりです。

C#
95点を取得しました。日付:2026/06/13

3-2. 複数の値を埋め込む方法

string.Formatでは、複数の値を {0}{1}{2} のように指定できます。

C#
string name = "鈴木";
int age = 28;
string department = "営業部";

string text = string.Format("名前:{0}、年齢:{1}、部署:{2}", name, age, department);

Console.WriteLine(text);

出力結果は次のようになります。

C#
名前:鈴木、年齢:28、部署:営業部

同じ値を複数回使うこともできます。

C#
string text = string.Format("{0}さん、こんにちは。{0}さんの登録が完了しました。", "田中");

Console.WriteLine(text);

出力結果は次のとおりです。

C#
田中さん、こんにちは。田中さんの登録が完了しました。

string.Formatでは、引数の順番とインデックス番号を正しく対応させることが重要です。

3-3. 桁揃え・右寄せ・左寄せの指定方法

string.Formatでは、文字幅を指定して右寄せ・左寄せできます。

基本形は次のとおりです。

C#
{インデックス,}

正の幅を指定すると右寄せになります。

C#
Console.WriteLine(string.Format("|{0,10}|", "ABC"));

出力結果は次のようになります。

C#
|       ABC|

負の幅を指定すると左寄せになります。

C#
Console.WriteLine(string.Format("|{0,-10}|", "ABC"));

出力結果は次のとおりです。

C#
|ABC       |

数値にも使えます。

C#
Console.WriteLine(string.Format("|{0,5}|{1,10:N0}|", 1, 1000));
Console.WriteLine(string.Format("|{0,5}|{1,10:N0}|", 20, 25000));
Console.WriteLine(string.Format("|{0,5}|{1,10:N0}|", 300, 1234567));

出力例は次のようになります。

C#
|    1|     1,000|
| 20| 25,000|
| 300| 1,234,567|

ログやコンソール出力で表形式に見せたい場合に便利です。

3-4. 文字列補間($"{}")で同じ処理を書く方法

文字列補間を使うと、string.Formatよりも自然に書けます。

C#
string name = "山田";
int age = 30;

string text = $"名前:{name}、年齢:{age}";

Console.WriteLine(text);

出力結果は次のとおりです。

C#
名前:山田、年齢:30

書式指定もできます。

C#
int price = 1234567;
DateTime date = new DateTime(2026, 6, 13);

Console.WriteLine($"金額:{price:N0}円");
Console.WriteLine($"日付:{date:yyyy/MM/dd}");

出力結果は次のようになります。

C#
金額:1,234,567
日付:2026/06/13

桁揃えも可能です。

C#
Console.WriteLine($"|{"ABC",10}|");
Console.WriteLine($"|{"ABC",-10}|");

出力結果は次のとおりです。

C#
|       ABC|
|ABC |

文字列補間では、次のような形式で書式と幅を指定できます。

C#
$"{値,幅:書式}"

たとえば、右寄せ10桁でカンマ区切りにする場合は次のように書きます。

C#
int amount = 1234567;

Console.WriteLine($"{amount,10:N0}");

3-5. string.Formatと文字列補間はどちらを使うべきか

通常のコードでは、文字列補間を使うのがおすすめです。

C#
string name = "田中";
int point = 80;

string message = $"{name}さんの点数は{point}点です。";

文字列補間は、値がその場に書かれるため、可読性が高くなります。

一方、string.Formatが向いている場面もあります。

C#
string template = "{0}さんの点数は{1}点です。";

string message = string.Format(template, "田中", 80);

テンプレート文字列を外部ファイルやリソースから読み込む場合は、string.Formatの方が扱いやすいことがあります。

使い分けの目安は次のとおりです。

方法向いている場面
文字列補間通常の文字列組み立て、ログ、画面表示
string.Formatテンプレートを後から渡す、リソース文字列を使う
ToString1つの値を整形して文字列化する

基本は文字列補間、必要に応じて string.FormatToString を使うとよいでしょう。

4. C#の数値書式指定|0埋め・桁区切り・小数点・通貨

4-1. 数値の標準書式指定子とは

C#の数値書式には、標準書式指定子とカスタム書式指定子があります。

標準書式指定子は、NDFCP など、あらかじめ用意された記号で書式を指定する方法です。

C#
int number = 1234;
double value = 1234.567;

Console.WriteLine(number.ToString("N0"));
Console.WriteLine(number.ToString("D6"));
Console.WriteLine(value.ToString("F2"));
Console.WriteLine(value.ToString("C"));
Console.WriteLine(0.1234.ToString("P2"));

よく使う標準書式指定子は次のとおりです。

指定子意味
D10進数、0埋め000123
N数値、桁区切り1,234.00
F固定小数点1234.57
C通貨¥1,234
Pパーセント12.34%
X16進数4D2
E指数表記1.234567E+003
G一般形式値に応じた形式

指定子の後ろに数字を付けると、桁数や小数点以下の桁数を指定できます。

C#
Console.WriteLine(1234.ToString("N0"));     // 1,234
Console.WriteLine(1234.567.ToString("N2")); // 1,234.57
Console.WriteLine(1234.ToString("D6")); // 001234

4-2. 0埋めする方法:D指定子とカスタム書式

整数を0埋めする場合は、D指定子を使うのが簡単です。

C#
int id = 1;

Console.WriteLine(id.ToString("D4"));

出力結果は次のとおりです。

C#
0001

D4は「最低4桁で表示し、足りない部分を0で埋める」という意味です。

C#
Console.WriteLine(1.ToString("D4"));    // 0001
Console.WriteLine(12.ToString("D4")); // 0012
Console.WriteLine(123.ToString("D4")); // 0123
Console.WriteLine(1234.ToString("D4")); // 1234

カスタム書式でも0埋めできます。

C#
int id = 1;

Console.WriteLine(id.ToString("0000"));

出力結果は次のとおりです。

C#
0001

整数の0埋めだけなら D4 が分かりやすくおすすめです。

ただし、D指定子は整数型で使うものです。doubledecimal などの小数型では使えないため、小数を含む場合はカスタム書式を使います。

C#
double value = 12.3;

Console.WriteLine(value.ToString("000.00"));

出力結果は次のようになります。

C#
012.30

4-3. 桁区切りカンマを付ける方法:N指定子

数値に桁区切りカンマを付けるには、N指定子を使います。

C#
int amount = 1234567;

Console.WriteLine(amount.ToString("N0"));

出力結果は次のとおりです。

C#
1,234,567

N0は、小数点以下0桁で桁区切りを付ける指定です。

C#
double value = 1234567.89;

Console.WriteLine(value.ToString("N2"));

出力結果は次のようになります。

C#
1,234,567.89

N2は、小数点以下2桁で表示します。

金額を「円」付きで表示する場合は、次のように書けます。

C#
int price = 1234567;

Console.WriteLine($"{price:N0}円");

出力結果は次のとおりです。

C#
1,234,567

4-4. 小数点以下の桁数を指定する方法

小数点以下の桁数を指定する場合は、F指定子または N指定子を使います。

C#
double value = 1234.5678;

Console.WriteLine(value.ToString("F2"));
Console.WriteLine(value.ToString("N2"));

出力結果は次のようになります。

C#
1234.57
1,234.57

F2は固定小数点で、小数点以下2桁にします。

N2は桁区切り付きで、小数点以下2桁にします。

C#
Console.WriteLine(1.2.ToString("F2"));     // 1.20
Console.WriteLine(1.234.ToString("F2")); // 1.23
Console.WriteLine(1.235.ToString("F2")); // 1.24

表示上の桁数を整える場合に便利です。

ただし、書式指定はあくまで文字列表示の形式を整えるものです。数値そのものを丸めて保存したい場合は、Math.Roundなどを使います。

C#
double value = 1.235;

double rounded = Math.Round(value, 2);

Console.WriteLine(rounded);

表示だけ整えたい場合は ToString("F2")、計算結果として丸めたい場合は Math.Round と考えると分かりやすいです。

4-5. パーセント表示に変換する方法

数値をパーセント表示にするには、P指定子を使います。

C#
double rate = 0.1234;

Console.WriteLine(rate.ToString("P2"));

出力結果は次のようになります。

C#
12.34%

P指定子は、値を100倍して % を付けて表示します。

C#
Console.WriteLine(0.1.ToString("P0"));    // 10%
Console.WriteLine(0.1234.ToString("P1")); // 12.3%
Console.WriteLine(0.1234.ToString("P2")); // 12.34%

そのため、すでに 12.34 のような値を持っている場合に P2 を使うと、1,234.00% のようになります。

C#
double rate = 12.34;

Console.WriteLine(rate.ToString("P2"));

出力例は次のとおりです。

C#
1,234.00%

パーセント表示では、元の値が 0.1234 なのか 12.34 なのかを確認することが大切です。

4-6. 通貨形式で表示する方法

通貨形式で表示するには、C指定子を使います。

C#
int price = 1000;

Console.WriteLine(price.ToString("C"));

日本語環境では、出力例は次のようになります。

C#
¥1,000

小数点以下の桁数を指定することもできます。

C#
decimal price = 1000.5m;

Console.WriteLine(price.ToString("C0"));
Console.WriteLine(price.ToString("C2"));

出力例は次のとおりです。

C#
¥1,001
¥1,000.50

通貨記号や桁区切り、小数点の扱いはカルチャによって変わります。

C#
using System.Globalization;

decimal price = 1000m;

Console.WriteLine(price.ToString("C", new CultureInfo("ja-JP")));
Console.WriteLine(price.ToString("C", new CultureInfo("en-US")));

出力例は次のようになります。

C#
¥1,000
$1,000.00

日本円、米ドル、ユーロなど、地域に応じた表示をしたい場合は CultureInfo を明示すると安全です。

4-7. 16進数・指数表記で表示する方法

整数を16進数で表示するには、X指定子を使います。

C#
int number = 255;

Console.WriteLine(number.ToString("X"));
Console.WriteLine(number.ToString("x"));

出力結果は次のとおりです。

C#
FF
ff

Xは大文字、xは小文字の16進数になります。

桁数を指定して0埋めすることもできます。

C#
int number = 255;

Console.WriteLine(number.ToString("X4"));

出力結果は次のようになります。

C#
00FF

指数表記には E指定子を使います。

C#
double value = 12345.6789;

Console.WriteLine(value.ToString("E2"));

出力例は次のとおりです。

C#
1.23E+004

E2は小数点以下2桁の指数表記です。科学計算や大きな数値、小さな数値を扱う場合に使われます。

4-8. 数値書式指定のサンプルコード早見表

数値書式のよく使う例をまとめます。

C#
int i = 1234;
double d = 1234.5678;
decimal money = 1000m;

Console.WriteLine(i.ToString("D6")); // 001234
Console.WriteLine(i.ToString("N0")); // 1,234
Console.WriteLine(d.ToString("N2")); // 1,234.57
Console.WriteLine(d.ToString("F2")); // 1234.57
Console.WriteLine(0.1234.ToString("P2")); // 12.34%
Console.WriteLine(money.ToString("C")); // ¥1,000
Console.WriteLine(i.ToString("X")); // 4D2
Console.WriteLine(d.ToString("E2")); // 1.23E+003

文字列補間で書く場合は次のとおりです。

C#
Console.WriteLine($"{i:D6}");
Console.WriteLine($"{i:N0}");
Console.WriteLine($"{d:N2}");
Console.WriteLine($"{d:F2}");
Console.WriteLine($"{0.1234:P2}");
Console.WriteLine($"{money:C}");
Console.WriteLine($"{i:X}");
Console.WriteLine($"{d:E2}");

よく使う指定は、DNFCP の5つです。まずはこの5つを覚えると、実務で困る場面はかなり減ります。

5. C#の日付・時刻の書式指定|DateTimeのformat/ToString

5-1. DateTime.ToStringで日付を整形する基本

DateTimeの書式指定では、ToString("書式")を使って日付や時刻の表示形式を指定します。

C#
DateTime date = new DateTime(2026, 6, 13, 15, 30, 45);

Console.WriteLine(date.ToString("yyyy/MM/dd"));
Console.WriteLine(date.ToString("HH:mm:ss"));
Console.WriteLine(date.ToString("yyyy/MM/dd HH:mm:ss"));

出力結果は次のとおりです。

C#
2026/06/13
15:30:45
2026/06/13 15:30:45

日付の書式では、次の指定子をよく使います。

指定子意味
yyyy4桁の年2026
MM2桁の月06
dd2桁の日13
HH24時間表記の時15
mm30
ss45

大文字と小文字で意味が変わるものがあるため、特に MMmm の違いには注意が必要です。

5-2. yyyy/MM/dd形式で表示する方法

日付を yyyy/MM/dd 形式で表示するには、次のように書きます。

C#
DateTime date = new DateTime(2026, 6, 13);

Console.WriteLine(date.ToString("yyyy/MM/dd"));

出力結果は次のとおりです。

C#
2026/06/13

ハイフン区切りにしたい場合は、次のようにします。

C#
Console.WriteLine(date.ToString("yyyy-MM-dd"));

出力結果は次のようになります。

C#
2026-06-13

年月日を区切りなしで表示することもできます。

C#
Console.WriteLine(date.ToString("yyyyMMdd"));

出力結果は次のとおりです。

C#
20260613

ファイル名やログIDに日付を含める場合によく使われます。

5-3. 時刻をHH:mm:ss形式で表示する方法

時刻を HH:mm:ss 形式で表示するには、次のように書きます。

C#
DateTime time = new DateTime(2026, 6, 13, 15, 30, 45);

Console.WriteLine(time.ToString("HH:mm:ss"));

出力結果は次のとおりです。

C#
15:30:45

HHは24時間表記です。

12時間表記を使う場合は hh を使います。

C#
Console.WriteLine(time.ToString("hh:mm:ss"));

出力例は次のようになります。

C#
03:30:45

午前・午後を表示したい場合は tt を使います。

C#
Console.WriteLine(time.ToString("tt hh:mm"));

日本語環境では、出力例は次のようになります。

C#
午後 03:30

ログなどでは、誤解が少ない HH:mm:ss の24時間表記がよく使われます。

5-4. 曜日を表示する方法

曜日を表示するには、ddd または dddd を使います。

C#
DateTime date = new DateTime(2026, 6, 13);

Console.WriteLine(date.ToString("ddd"));
Console.WriteLine(date.ToString("dddd"));

日本語環境では、出力例は次のようになります。

C#

土曜日

日付と曜日を組み合わせることもできます。

C#
Console.WriteLine(date.ToString("yyyy/MM/dd(ddd)"));

出力例は次のとおりです。

C#
2026/06/13()

英語表記にしたい場合は、CultureInfo を指定します。

C#
using System.Globalization;

DateTime date = new DateTime(2026, 6, 13);

Console.WriteLine(date.ToString("dddd", new CultureInfo("en-US")));

出力結果は次のようになります。

C#
Saturday

曜日名はカルチャの影響を受けるため、多言語対応では CultureInfo の指定を検討しましょう。

5-5. 年月日・月日・日時を日本語形式で表示する方法

日本語形式で年月日を表示するには、書式文字列に日本語を含めます。

C#
DateTime date = new DateTime(2026, 6, 13);

Console.WriteLine(date.ToString("yyyy年MM月dd日"));

出力結果は次のとおりです。

C#
2026年06月13日

月日だけ表示する場合は次のようにします。

C#
Console.WriteLine(date.ToString("MM月dd日"));

出力結果は次のようになります。

C#
06月13日

日時を日本語形式で表示する場合は、次のように書けます。

C#
DateTime dateTime = new DateTime(2026, 6, 13, 15, 30, 45);

Console.WriteLine(dateTime.ToString("yyyy年MM月dd日 HH時mm分ss秒"));

出力結果は次のとおりです。

C#
2026年06月13日 15時30分45秒

画面表示や帳票では日本語形式、ログやシステム連携では yyyy-MM-dd HH:mm:ss のような形式を使うことが多いです。

5-6. 標準の日付時刻書式指定子の使い方

日付時刻には、あらかじめ用意された標準書式指定子があります。

C#
DateTime date = new DateTime(2026, 6, 13, 15, 30, 45);

Console.WriteLine(date.ToString("d"));
Console.WriteLine(date.ToString("D"));
Console.WriteLine(date.ToString("f"));
Console.WriteLine(date.ToString("F"));
Console.WriteLine(date.ToString("g"));
Console.WriteLine(date.ToString("G"));

日本語環境での出力例は次のようになります。

C#
2026/06/13
2026年6月13日
2026年6月13日 15:30
2026年6月13日 15:30:45
2026/06/13 15:30
2026/06/13 15:30:45

よく使う標準書式指定子は次のとおりです。

指定子意味
d短い日付
D長い日付
t短い時刻
T長い時刻
f長い日付 + 短い時刻
F長い日付 + 長い時刻
g短い日付 + 短い時刻
G短い日付 + 長い時刻
sISO 8601風の日時
oラウンドトリップ日時
RRFC1123形式

標準書式指定子はカルチャの影響を受けるものが多いため、表示先の地域によって結果が変わる場合があります。

5-7. カスタム日付時刻書式指定子の使い方

カスタム日付時刻書式指定子を使うと、任意の形式で日付や時刻を表示できます。

C#
DateTime date = new DateTime(2026, 6, 13, 15, 30, 45);

Console.WriteLine(date.ToString("yyyy/MM/dd"));
Console.WriteLine(date.ToString("yyyy-MM-dd HH:mm:ss"));
Console.WriteLine(date.ToString("yyyyMMddHHmmss"));
Console.WriteLine(date.ToString("yyyy年MM月dd日(ddd)"));

出力例は次のとおりです。

C#
2026/06/13
2026-06-13 15:30:45
20260613153045
2026年06月13日()

日付時刻のカスタム書式でよく使う指定子は次のとおりです。

指定子意味
yyyy4桁の年
yy2桁の年
MM2桁の月
M1桁または2桁の月
dd2桁の日
d1桁または2桁の日
HH24時間表記の時
hh12時間表記の時
mm
ss
fffミリ秒
ddd短い曜日
dddd長い曜日

カスタム書式は自由度が高い一方で、大文字・小文字の違いによるミスが起きやすいので注意しましょう。

5-8. DateTime書式指定のサンプルコード早見表

DateTimeのよく使う書式指定をまとめます。

C#
DateTime dt = new DateTime(2026, 6, 13, 15, 30, 45);

Console.WriteLine(dt.ToString("yyyy/MM/dd")); // 2026/06/13
Console.WriteLine(dt.ToString("yyyy-MM-dd")); // 2026-06-13
Console.WriteLine(dt.ToString("yyyyMMdd")); // 20260613
Console.WriteLine(dt.ToString("HH:mm:ss")); // 15:30:45
Console.WriteLine(dt.ToString("yyyy/MM/dd HH:mm:ss")); // 2026/06/13 15:30:45
Console.WriteLine(dt.ToString("yyyyMMddHHmmss")); // 20260613153045
Console.WriteLine(dt.ToString("yyyy年MM月dd日")); // 2026年06月13日
Console.WriteLine(dt.ToString("yyyy年MM月dd日(ddd)")); // 2026年06月13日(土)

ログ出力では次の形式がよく使われます。

C#
DateTime now = DateTime.Now;

string logTime = now.ToString("yyyy-MM-dd HH:mm:ss.fff");

Console.WriteLine(logTime);

ファイル名に使う場合は、スラッシュやコロンを避けるのがポイントです。

C#
string fileName = DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".log";

Console.WriteLine(fileName);

出力例は次のようになります。

C#
20260613_153045.log

ファイル名では /: が使えない環境があるため、yyyyMMdd_HHmmss のような形式が安全です。

6. C#のカスタム書式指定|独自ルールで表示を整える

6-1. カスタム数値書式指定子の基本

カスタム数値書式指定子を使うと、標準書式では表現しにくい形式を指定できます。

C#
double value = 1234.5;

Console.WriteLine(value.ToString("0000.00"));
Console.WriteLine(value.ToString("#,##0.00"));

出力結果は次のとおりです。

C#
1234.50
1,234.50

カスタム数値書式では、主に次の記号を使います。

記号意味
0桁がない場合も0を表示
#桁がある場合だけ表示
.小数点
,桁区切り
%パーセント表示
;正・負・ゼロの表示を分ける

たとえば、金額をカンマ区切りで小数点以下2桁にする場合は、次のように書きます。

C#
decimal amount = 1234.5m;

Console.WriteLine(amount.ToString("#,##0.00"));

出力結果は次のようになります。

C#
1,234.50

6-2. 0・#・.・,の意味と使い分け

0#は似ていますが、意味が異なります。

0は、該当する桁がない場合でも0を表示します。

C#
int number = 12;

Console.WriteLine(number.ToString("0000"));

出力結果は次のとおりです。

C#
0012

#は、該当する桁がある場合だけ表示します。

C#
int number = 12;

Console.WriteLine(number.ToString("####"));

出力結果は次のようになります。

C#
12

小数の場合も違いがあります。

C#
double value = 1.2;

Console.WriteLine(value.ToString("0.00"));
Console.WriteLine(value.ToString("0.##"));

出力結果は次のとおりです。

C#
1.20
1.2

0.00は小数点以下2桁を必ず表示します。

0.##は必要な分だけ表示します。

桁区切りを入れる場合は , を使います。

C#
int number = 1234567;

Console.WriteLine(number.ToString("#,##0"));

出力結果は次のようになります。

C#
1,234,567

実務では、次のように使い分けると分かりやすいです。

表示したい内容書式
4桁0埋め0000
小数2桁固定0.00
小数は必要な分だけ0.##
カンマ区切り#,##0
カンマ区切り + 小数2桁#,##0.00

6-3. 正の数・負の数・ゼロで表示を分ける方法

カスタム数値書式では、セミコロン ; を使って、正の数、負の数、ゼロの表示を分けられます。

基本形は次のとおりです。

C#
正の書式;負の書式;ゼロの書式

サンプルコードを見てみましょう。

C#
int positive = 1000;
int negative = -1000;
int zero = 0;

string format = "#,##0;▲#,##0;ゼロ";

Console.WriteLine(positive.ToString(format));
Console.WriteLine(negative.ToString(format));
Console.WriteLine(zero.ToString(format));

出力結果は次のようになります。

C#
1,000
▲1,000
ゼロ

会計や帳票では、負の数を -1,000 ではなく ▲1,000 のように表示したいことがあります。

括弧付きで表示することもできます。

C#
int value = -1000;

Console.WriteLine(value.ToString("#,##0;(#,##0);0"));

出力結果は次のとおりです。

C#
(1,000)

正負やゼロで表示を変えたい場合は、セミコロン区切りのカスタム書式が便利です。

6-4. カスタム日付時刻書式指定子の基本

日付時刻のカスタム書式では、年、月、日、時、分、秒などを組み合わせて指定します。

C#
DateTime dt = new DateTime(2026, 6, 13, 15, 30, 45);

Console.WriteLine(dt.ToString("yyyy/MM/dd"));
Console.WriteLine(dt.ToString("HH:mm:ss"));
Console.WriteLine(dt.ToString("yyyy-MM-dd HH:mm:ss"));

出力結果は次のとおりです。

C#
2026/06/13
15:30:45
2026-06-13 15:30:45

よく使う指定子は次のとおりです。

指定子意味
yyyy4桁の年2026
MM2桁の月06
dd2桁の日13
HH24時間表記の時15
mm30
ss45
fffミリ秒123

カスタム日付時刻書式は、ログ、ファイル名、画面表示、帳票などでよく使われます。

6-5. yyyy・MM・dd・HH・mm・ssの違い

日付時刻書式で特に重要なのは、大文字と小文字の違いです。

指定子意味
yyyy
MM
dd
HH時、24時間表記
hh時、12時間表記
mm
ss

よくある間違いが、月の MM と分の mm を逆に書いてしまうことです。

C#
DateTime dt = new DateTime(2026, 6, 13, 15, 30, 45);

Console.WriteLine(dt.ToString("yyyy/mm/dd"));
Console.WriteLine(dt.ToString("yyyy/MM/dd"));

出力結果は次のようになります。

C#
2026/30/13
2026/06/13

yyyy/mm/ddmm は「月」ではなく「分」です。そのため、30 が表示されています。

月を表示する場合は必ず MM を使います。

C#
dt.ToString("yyyy/MM/dd");

時刻の分を表示する場合は mm を使います。

C#
dt.ToString("HH:mm:ss");

この違いを覚えておくと、日付書式のミスを大きく減らせます。

6-6. エスケープが必要な文字と書き方

日付時刻のカスタム書式では、一部の文字が書式指定子として解釈されます。

そのため、文字として表示したい場合はエスケープが必要になることがあります。

たとえば、hm などは時刻の指定子として扱われます。

文字として表示したい場合は、シングルクォートで囲む方法があります。

C#
DateTime dt = new DateTime(2026, 6, 13, 15, 30, 45);

Console.WriteLine(dt.ToString("yyyy/MM/dd 'at' HH:mm:ss"));

出力結果は次のようになります。

C#
2026/06/13 at 15:30:45

バックスラッシュでエスケープすることもできます。

C#
Console.WriteLine(dt.ToString("HH\\hmm\\mss\\s"));

出力例は次のとおりです。

C#
15h30m45s

ただし、C#の文字列では \ 自体もエスケープ文字です。そのため、通常の文字列では \\ と書く必要があります。

逐語的文字列リテラルを使う場合は、次のように書けます。

C#
Console.WriteLine(dt.ToString(@"HH\hmm\mss\s"));

エスケープが複雑になる場合は、シングルクォートで囲む書き方の方が読みやすいこともあります。

7. CultureInfoを使った書式指定|日本語・英語・通貨表示の違い

7-1. CultureInfoとは何か

CultureInfoとは、言語や地域ごとの表示ルールを表すクラスです。

C#の書式指定では、日付、曜日、通貨、小数点、桁区切りなどがカルチャの影響を受けます。

C#
using System.Globalization;

decimal price = 1234.56m;

Console.WriteLine(price.ToString("C", new CultureInfo("ja-JP")));
Console.WriteLine(price.ToString("C", new CultureInfo("en-US")));

出力例は次のようになります。

C#
¥1,235
$1,234.56

日本語環境では円、米国環境ではドルのように、同じ C 指定子でも結果が変わります。

日付もカルチャによって表示が変わります。

C#
DateTime date = new DateTime(2026, 6, 13);

Console.WriteLine(date.ToString("D", new CultureInfo("ja-JP")));
Console.WriteLine(date.ToString("D", new CultureInfo("en-US")));

出力例は次のとおりです。

C#
2026年6月13日
Saturday, June 13, 2026

多言語対応や通貨表示では、CultureInfoの理解が重要です。

7-2. 日本語環境で日付・通貨を表示する方法

日本語環境の書式を明示したい場合は、new CultureInfo("ja-JP") を指定します。

C#
using System.Globalization;

DateTime date = new DateTime(2026, 6, 13);
decimal price = 1000m;

CultureInfo culture = new CultureInfo("ja-JP");

Console.WriteLine(date.ToString("D", culture));
Console.WriteLine(price.ToString("C", culture));

出力例は次のようになります。

C#
2026年6月13日
¥1,000

曜日も日本語になります。

C#
Console.WriteLine(date.ToString("dddd", culture));

出力結果は次のとおりです。

C#
土曜日

日本国内向けの業務システムでは、実行環境に依存しないように ja-JP を明示すると安全です。

7-3. 英語・米国形式で日付や通貨を表示する方法

英語・米国形式で表示したい場合は、en-US を指定します。

C#
using System.Globalization;

DateTime date = new DateTime(2026, 6, 13);
decimal price = 1000m;

CultureInfo culture = new CultureInfo("en-US");

Console.WriteLine(date.ToString("D", culture));
Console.WriteLine(price.ToString("C", culture));

出力例は次のようになります。

C#
Saturday, June 13, 2026
$1,000.00

短い日付形式も変わります。

C#
Console.WriteLine(date.ToString("d", culture));

出力例は次のとおりです。

C#
6/13/2026

同じ dD でも、カルチャによって表示順や言語が変わる点に注意しましょう。

7-4. 現在のカルチャを使う場合と明示指定する場合

C#では、CultureInfoを指定しない場合、通常は現在のカルチャが使われます。

C#
decimal price = 1000m;

Console.WriteLine(price.ToString("C"));

日本語環境なら ¥1,000、米国環境なら $1,000.00 のように表示が変わる可能性があります。

画面表示など、ユーザーの地域設定に合わせたい場合は、現在のカルチャを使うのが自然です。

一方で、次のような場合はカルチャを明示した方が安全です。

場面推奨
日本国内向け帳票ja-JP を明示
米国向け表示en-US を明示
CSVやAPI連携InvariantCulture を検討
ログ出力固定形式を指定
テストコードカルチャを明示

実行環境によって表示が変わると困る場合は、必ず CultureInfo を指定しましょう。

7-5. InvariantCultureを使うべきケース

InvariantCultureは、特定の国や地域に依存しない固定的なカルチャです。

主に、データ保存、ログ、CSV、API連携などで使われます。

C#
using System.Globalization;

double value = 1234.56;

string text = value.ToString(CultureInfo.InvariantCulture);

Console.WriteLine(text);

出力例は次のとおりです。

C#
1234.56

小数点が . で固定されるため、システム間連携で扱いやすくなります。

日付を固定形式で出力する場合も、InvariantCultureが使われます。

C#
DateTime dt = new DateTime(2026, 6, 13, 15, 30, 45);

string text = dt.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);

Console.WriteLine(text);

出力結果は次のとおりです。

C#
2026-06-13 15:30:45

ユーザーに見せる表示は ja-JPen-US、システム用の固定形式は InvariantCulture と使い分けるとよいでしょう。

7-6. 多言語対応で注意すべき書式指定のポイント

多言語対応では、書式指定を固定しすぎると問題になることがあります。

たとえば、日本では yyyy/MM/dd が自然でも、米国では MM/dd/yyyy の方が一般的です。

C#
DateTime date = new DateTime(2026, 6, 13);

Console.WriteLine(date.ToString("d", new CultureInfo("ja-JP")));
Console.WriteLine(date.ToString("d", new CultureInfo("en-US")));

出力例は次のようになります。

C#
2026/06/13
6/13/2026

また、通貨記号や小数点、桁区切りも地域によって異なります。

C#
decimal price = 1234.56m;

Console.WriteLine(price.ToString("C", new CultureInfo("ja-JP")));
Console.WriteLine(price.ToString("C", new CultureInfo("en-US")));
Console.WriteLine(price.ToString("C", new CultureInfo("fr-FR")));

出力例は次のようになります。

C#
¥1,235
$1,234.56
1 234,56

多言語対応で注意すべきポイントは次のとおりです。

ポイント内容
画面表示ユーザーのカルチャに合わせる
保存形式カルチャに依存しない形式にする
金額通貨とカルチャを正しく指定する
日付入出力で形式を混同しない
CSV小数点や区切り文字に注意する

「人に見せる書式」と「システムで扱う書式」を分けて考えることが大切です。

8. C#の書式指定でよくあるエラーと対策

8-1. FormatExceptionが発生する原因

FormatExceptionは、書式指定の形式が正しくない場合に発生します。

たとえば、string.Formatで閉じ括弧が不足しているとエラーになります。

C#
string text = string.Format("{0", 123);

このコードは、書式文字列が不正なため FormatException になります。

また、存在しないインデックスを指定した場合もエラーになります。

C#
string text = string.Format("{1}", "A");

{1} は2番目の引数を参照しますが、引数は1つしかないためエラーになります。

対策としては、次の点を確認しましょう。

確認ポイント内容
波括弧{} が対応しているか
インデックス{0}{1} と引数の数が合っているか
書式指定対象の型に合った書式か
エスケープ{} を文字として表示する場合に {{}} を使っているか

特に string.Format では、波括弧の書き間違いがよくある原因です。

8-2. インデックス番号の指定ミス

string.Formatでは、インデックス番号は0から始まります。

C#
string text = string.Format("{0} {1}", "A", "B");

Console.WriteLine(text);

出力結果は次のとおりです。

C#
A B

次のように、存在しないインデックスを指定するとエラーになります。

C#
string text = string.Format("{0} {2}", "A", "B");

{2} は3番目の引数を参照しますが、引数は2つしかありません。

修正例は次のとおりです。

C#
string text = string.Format("{0} {1}", "A", "B");

文字列補間を使うと、インデックス番号のミスを避けやすくなります。

C#
string a = "A";
string b = "B";

string text = $"{a} {b}";

可読性や保守性を考えると、通常は文字列補間の方が安全です。

8-3. 波括弧{}を文字として表示したい場合

string.Formatや文字列補間では、{} は特別な意味を持ちます。

波括弧を文字として表示したい場合は、{{}} のように2つ重ねます。

C#
string text = string.Format("値は{{{0}}}です。", 123);

Console.WriteLine(text);

出力結果は次のとおりです。

C#
値は{123}です。

文字列補間でも同じです。

C#
int value = 123;

Console.WriteLine($"値は{{{value}}}です。");

出力結果は次のようになります。

C#
値は{123}です。

JSONのように波括弧を含む文字列を作る場合は注意が必要です。

C#
string name = "Taro";

string json = $"{{\"name\":\"{name}\"}}";

Console.WriteLine(json);

出力結果は次のとおりです。

C#
{"name":"Taro"}

波括弧をそのまま書くと書式指定と解釈されるため、文字として表示する場合は必ずエスケープしましょう。

8-4. null値をformat/ToStringするときの注意点

nullに対して ToString() を呼び出すと、NullReferenceException が発生します。

C#
string name = null;

Console.WriteLine(name.ToString());

このコードはエラーになります。

対策として、null条件演算子やnull合体演算子を使います。

C#
string name = null;

Console.WriteLine(name?.ToString() ?? "未設定");

出力結果は次のとおりです。

C#
未設定

string.Formatや文字列補間では、nullは空文字に近い形で扱われます。

C#
string name = null;

Console.WriteLine(string.Format("名前:{0}", name));
Console.WriteLine($"名前:{name}");

出力結果は次のようになります。

C#
名前:
名前:

ただし、数値や日付などのnullable型では注意が必要です。

C#
int? value = null;

Console.WriteLine(value?.ToString("D4") ?? "未設定");

出力結果は次のとおりです。

C#
未設定

nullable型に書式指定を行う場合は、nullチェックを忘れないようにしましょう。

8-5. 日付書式でMMとmmを間違えるケース

日付書式で非常に多いミスが、月の MM と分の mm を間違えるケースです。

C#
DateTime dt = new DateTime(2026, 6, 13, 15, 30, 45);

Console.WriteLine(dt.ToString("yyyy/mm/dd"));

出力結果は次のようになります。

C#
2026/30/13

mm は月ではなく分です。そのため、06 ではなく 30 が表示されています。

正しくは次のように書きます。

C#
Console.WriteLine(dt.ToString("yyyy/MM/dd"));

出力結果は次のとおりです。

C#
2026/06/13

覚え方は次のとおりです。

指定子意味
MMMonth、月
mmminute、分

日付は yyyy/MM/dd、時刻は HH:mm:ss とセットで覚えておくと間違いにくくなります。

8-6. yyyyとYYYYの違いに注意すべき理由

C#のカスタム日付時刻書式で年を4桁表示する場合は、基本的に yyyy を使います。

C#
DateTime date = new DateTime(2026, 6, 13);

Console.WriteLine(date.ToString("yyyy/MM/dd"));

出力結果は次のとおりです。

C#
2026/06/13

一方、YYYY のような大文字の Y は、C#のカスタム日付時刻書式における4桁年の指定としては使いません。

C#
Console.WriteLine(date.ToString("YYYY/MM/dd"));

期待どおりの結果にならない可能性があります。

他の言語やライブラリでは YYYY が年を表す場合がありますが、C#の DateTime.ToString では yyyy を使うと覚えておきましょう。

特に、Java、JavaScriptの一部ライブラリ、SQL、Excelなどと書式を混同している場合にミスが起きやすいです。

C#でよく使う基本形は次のとおりです。

C#
date.ToString("yyyy/MM/dd");
date.ToString("yyyy-MM-dd");
date.ToString("yyyyMMdd");

年は小文字の yyyy、月は大文字の MM、分は小文字の mm と整理しておくことが大切です。

8-7. 小数点・桁区切りが想定と違う場合の対処法

小数点や桁区切りが想定と違う場合は、カルチャの影響を確認しましょう。

たとえば、地域によっては小数点が . ではなく , になることがあります。

C#
using System.Globalization;

double value = 1234.56;

Console.WriteLine(value.ToString("N2", new CultureInfo("ja-JP")));
Console.WriteLine(value.ToString("N2", new CultureInfo("de-DE")));

出力例は次のようになります。

C#
1,234.56
1.234,56

日本語環境では 1,234.56、ドイツ語環境では 1.234,56 のように表示されます。

CSVやAPI連携で小数点を固定したい場合は、InvariantCultureを使うと安全です。

C#
using System.Globalization;

double value = 1234.56;

string text = value.ToString("F2", CultureInfo.InvariantCulture);

Console.WriteLine(text);

出力結果は次のとおりです。

C#
1234.56

画面表示ではユーザーのカルチャ、データ連携では InvariantCulture と使い分けるのが基本です。

9. C#の書式指定の使い分け|format・ToString・文字列補間

9-1. string.Formatが向いているケース

string.Formatは、テンプレート文字列を使って複数の値を埋め込む場合に向いています。

C#
string template = "{0}さんの購入金額は{1:N0}円です。";

string message = string.Format(template, "田中", 12345);

Console.WriteLine(message);

出力結果は次のとおりです。

C#
田中さんの購入金額は12,345円です。

特に、テンプレート文字列を外部から取得する場合に便利です。

C#
string template = GetMessageTemplate();

string message = string.Format(template, userName, amount);

たとえば、多言語対応のリソースファイルにメッセージを定義しておき、後から値を埋め込むようなケースです。

ただし、インデックス番号の間違いが起きやすいため、通常のコードでは文字列補間の方が読みやすいことが多いです。

9-2. ToStringが向いているケース

ToString("書式")は、1つの値を指定した形式で文字列化したい場合に向いています。

C#
int id = 1;
string idText = id.ToString("D4");

Console.WriteLine(idText);

出力結果は次のとおりです。

C#
0001

数値や日付を変数に格納してから使いたい場合にも便利です。

C#
DateTime now = DateTime.Now;

string timestamp = now.ToString("yyyyMMddHHmmss");

Console.WriteLine(timestamp);

ファイル名、ID、ログ時刻、CSV項目など、単一の値を整形する場合は ToString が分かりやすいです。

C#
string fileName = $"log_{DateTime.Now.ToString("yyyyMMdd_HHmmss")}.txt";

ただし、複数の値を組み合わせる場合は、文字列補間の中で書式指定した方が読みやすいこともあります。

9-3. 文字列補間が向いているケース

文字列補間は、現在のC#で最も使いやすい書式指定のひとつです。

C#
string name = "佐藤";
int amount = 12345;
DateTime date = new DateTime(2026, 6, 13);

string message = $"{name}さんは{date:yyyy/MM/dd}に{amount:N0}円購入しました。";

Console.WriteLine(message);

出力結果は次のようになります。

C#
佐藤さんは2026/06/13に12,345円購入しました。

文字列補間のメリットは、変数名がその場に見えることです。

string.Formatのように {0}{1} と引数の対応を確認する必要がありません。

C#
// string.Format
string text1 = string.Format("{0}さんの点数は{1}点です。", name, score);

// 文字列補間
string text2 = $"{name}さんの点数は{score}点です。";

通常の文字列組み立てでは、文字列補間を優先するとよいでしょう。

9-4. ログ出力・画面表示・CSV出力での使い分け

用途によって、適した書式指定は変わります。

ログ出力では、日付時刻を固定形式にするのが一般的です。

C#
DateTime now = DateTime.Now;
string level = "INFO";
string message = "処理を開始しました。";

string log = $"{now:yyyy-MM-dd HH:mm:ss.fff} [{level}] {message}";

Console.WriteLine(log);

出力例は次のとおりです。

C#
2026-06-13 15:30:45.123 [INFO] 処理を開始しました。

画面表示では、ユーザーにとって読みやすい形式を使います。

C#
decimal price = 12345m;

Console.WriteLine($"{price:N0}円");

CSV出力では、環境によって小数点や日付形式が変わると困るため、固定形式や InvariantCulture を使うことがあります。

C#
using System.Globalization;

DateTime date = new DateTime(2026, 6, 13);
double value = 1234.56;

string csv = string.Join(",",
date.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture),
value.ToString("F2", CultureInfo.InvariantCulture)
);

Console.WriteLine(csv);

出力結果は次のとおりです。

C#
2026-06-13,1234.56

使い分けの目安は次のとおりです。

用途推奨
画面表示文字列補間、ユーザーのカルチャ
ログ文字列補間、固定日時形式
CSVInvariantCulture、固定形式
帳票CultureInfoを明示
単一値の変換ToString("書式")
テンプレート埋め込みstring.Format

9-5. 可読性と保守性を高める書き方

書式指定では、動けばよいだけでなく、後から読んで分かりやすいことも大切です。

たとえば、複雑な書式を直接埋め込むより、定数化すると保守しやすくなります。

C#
const string DateFormat = "yyyy/MM/dd";
const string DateTimeFormat = "yyyy-MM-dd HH:mm:ss";

DateTime now = DateTime.Now;

Console.WriteLine(now.ToString(DateFormat));
Console.WriteLine(now.ToString(DateTimeFormat));

ログ形式など、複数箇所で使う書式は定数化すると変更に強くなります。

C#
const string LogTimestampFormat = "yyyy-MM-dd HH:mm:ss.fff";

string log = $"{DateTime.Now.ToString(LogTimestampFormat)} 処理開始";

また、カルチャを明示することで、実行環境による差を減らせます。

C#
using System.Globalization;

const string CsvDateFormat = "yyyy-MM-dd";

DateTime date = DateTime.Now;

string text = date.ToString(CsvDateFormat, CultureInfo.InvariantCulture);

可読性を高めるポイントは次のとおりです。

ポイント内容
基本は文字列補間変数名が見えて読みやすい
単一値はToString変換処理が明確
複雑な書式は定数化修正漏れを防げる
カルチャを明示環境差を減らせる
用途別に形式を分ける画面・ログ・CSVを混同しない

10. C#書式指定の実践サンプル集

10-1. 数値を0001のように0埋めする

数値を 0001 のように0埋めするには、D指定子を使います。

C#
int id = 1;

Console.WriteLine(id.ToString("D4"));

出力結果は次のとおりです。

C#
0001

文字列補間で書く場合は次のようになります。

C#
int id = 1;

Console.WriteLine($"{id:D4}");

出力結果は同じです。

C#
0001

伝票番号や会員番号を作る場合によく使います。

C#
int orderNo = 25;

string displayNo = $"ORD-{orderNo:D6}";

Console.WriteLine(displayNo);

出力結果は次のようになります。

C#
ORD-000025

10-2. 金額を¥1,000のように表示する

金額を通貨形式で表示するには、C指定子を使います。

C#
int price = 1000;

Console.WriteLine(price.ToString("C0"));

日本語環境では、出力例は次のようになります。

C#
¥1,000

カルチャを明示する場合は、次のように書きます。

C#
using System.Globalization;

int price = 1000;

Console.WriteLine(price.ToString("C0", new CultureInfo("ja-JP")));

出力結果は次のとおりです。

C#
¥1,000

「円」を文字として付けたい場合は、N0を使う方法もあります。

C#
int price = 1000;

Console.WriteLine($"{price:N0}円");

出力結果は次のようになります。

C#
1,000

通貨記号をカルチャに任せたい場合は C、日本語の「円」を固定で付けたい場合は N0 を使うと分かりやすいです。

10-3. 小数を2桁に丸めて表示する

小数を2桁で表示するには、F2 または N2 を使います。

C#
double value = 1234.5678;

Console.WriteLine(value.ToString("F2"));
Console.WriteLine(value.ToString("N2"));

出力結果は次のとおりです。

C#
1234.57
1,234.57

桁区切りが不要なら F2、桁区切りが必要なら N2 を使います。

文字列補間でも同じです。

C#
double value = 1234.5678;

Console.WriteLine($"{value:F2}");
Console.WriteLine($"{value:N2}");

出力結果は次のようになります。

C#
1234.57
1,234.57

ただし、これは表示上の丸めです。計算値として丸めたい場合は Math.Round を使います。

C#
double value = 1234.5678;

double rounded = Math.Round(value, 2);

Console.WriteLine(rounded);

10-4. 日付を2026年06月13日のように表示する

日付を 2026年06月13日 のように表示するには、カスタム日付書式を使います。

C#
DateTime date = new DateTime(2026, 6, 13);

Console.WriteLine(date.ToString("yyyy年MM月dd日"));

出力結果は次のとおりです。

C#
2026年06月13日

曜日も付ける場合は、次のようにします。

C#
Console.WriteLine(date.ToString("yyyy年MM月dd日(ddd)"));

日本語環境では、出力例は次のようになります。

C#
2026年06月13日()

画面表示や帳票ではよく使う形式です。

10-5. 日時をログ用フォーマットに変換する

ログ出力では、日時を固定形式にしておくと検索や並び替えがしやすくなります。

C#
DateTime now = new DateTime(2026, 6, 13, 15, 30, 45, 123);

string timestamp = now.ToString("yyyy-MM-dd HH:mm:ss.fff");

Console.WriteLine(timestamp);

出力結果は次のとおりです。

C#
2026-06-13 15:30:45.123

ログメッセージとして組み立てる場合は、文字列補間が便利です。

C#
DateTime now = DateTime.Now;
string level = "INFO";
string message = "ユーザー登録が完了しました。";

string log = $"{now:yyyy-MM-dd HH:mm:ss.fff} [{level}] {message}";

Console.WriteLine(log);

出力例は次のようになります。

C#
2026-06-13 15:30:45.123 [INFO] ユーザー登録が完了しました。

ログでは、カルチャに依存しない固定形式を使うのがおすすめです。

10-6. 表形式で文字幅を揃える

コンソールやログで表形式に表示したい場合は、幅指定を使います。

C#
Console.WriteLine($"{"ID",5} {"Name",-10} {"Amount",10}");
Console.WriteLine($"{1,5} {"Apple",-10} {1000,10:N0}");
Console.WriteLine($"{20,5} {"Orange",-10} {25000,10:N0}");
Console.WriteLine($"{300,5} {"Banana",-10} {1234567,10:N0}");

出力例は次のようになります。

C#
   ID Name           Amount
1 Apple 1,000
20 Orange 25,000
300 Banana 1,234,567

{値,幅} の幅が正の数なら右寄せ、負の数なら左寄せです。

C#
Console.WriteLine($"|{"ABC",10}|");   // 右寄せ
Console.WriteLine($"|{"ABC",-10}|"); // 左寄せ

出力結果は次のとおりです。

C#
|       ABC|
|ABC |

表形式のログやデバッグ出力で役立ちます。

10-7. CSV・帳票・ログ出力で使える書式例

CSV出力では、日付や小数の形式を固定すると扱いやすくなります。

C#
using System.Globalization;

DateTime date = new DateTime(2026, 6, 13);
decimal amount = 1234.56m;

string csv = string.Join(",",
date.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture),
amount.ToString("F2", CultureInfo.InvariantCulture)
);

Console.WriteLine(csv);

出力結果は次のとおりです。

C#
2026-06-13,1234.56

帳票では、日本語形式や桁区切りを使うことが多いです。

C#
DateTime date = new DateTime(2026, 6, 13);
int amount = 1234567;

Console.WriteLine($"請求日:{date:yyyy年MM月dd日}");
Console.WriteLine($"請求金額:{amount:N0}円");

出力結果は次のようになります。

C#
請求日:2026年06月13日
請求金額:1,234,567

ログでは、日時を固定形式にします。

C#
DateTime now = DateTime.Now;

Console.WriteLine($"{now:yyyy-MM-dd HH:mm:ss.fff} 処理を開始しました。");

用途別の書式例は次のとおりです。

用途書式例
CSV日付yyyy-MM-dd
CSV日時yyyy-MM-dd HH:mm:ss
ログ日時yyyy-MM-dd HH:mm:ss.fff
帳票日付yyyy年MM月dd日
金額N0 +
通貨C0
IDD4D6

11. C#の書式指定に関するよくある質問

11-1. formatとToStringの違いは何ですか?

formatという言葉は、C#では主に書式指定全般を指して使われます。

string.Formatは、テンプレート文字列に複数の値を埋め込むためのメソッドです。

C#
string text = string.Format("{0}さんは{1}点です。", "田中", 90);

一方、ToString("書式")は、1つの値を指定した形式で文字列に変換するメソッドです。

C#
int score = 90;

string text = score.ToString("D3");

使い分けるなら、複数の値を文章に埋め込むなら string.Format または文字列補間、1つの値を整形するなら ToString が向いています。

11-2. string.Formatと文字列補間はどちらが推奨ですか?

通常は、文字列補間の方が読みやすくおすすめです。

C#
string name = "田中";
int score = 90;

string text = $"{name}さんは{score}点です。";

string.Formatでは、{0}{1} と引数の対応を確認する必要があります。

C#
string text = string.Format("{0}さんは{1}点です。", name, score);

文字列補間は変数名がそのまま見えるため、保守しやすい書き方です。

ただし、テンプレート文字列を外部から取得する場合や、リソース文字列を使う場合は string.Format が向いています。

11-3. 0埋めはD指定子とカスタム書式のどちらを使うべきですか?

整数を0埋めするだけなら、D指定子がおすすめです。

C#
int id = 1;

Console.WriteLine(id.ToString("D4"));

出力結果は次のとおりです。

C#
0001

D4は「4桁の10進数」と分かりやすいため、意図が伝わりやすいです。

一方、小数を含む場合や独自の形式にしたい場合は、カスタム書式を使います。

C#
double value = 12.3;

Console.WriteLine(value.ToString("000.00"));

出力結果は次のようになります。

C#
012.30

整数のIDなら D4、小数や複雑な形式ならカスタム書式と考えるとよいでしょう。

11-4. DateTimeの書式で月と分を間違えない方法は?

月は大文字の MM、分は小文字の mm です。

C#
DateTime dt = new DateTime(2026, 6, 13, 15, 30, 45);

Console.WriteLine(dt.ToString("yyyy/MM/dd"));
Console.WriteLine(dt.ToString("HH:mm:ss"));

出力結果は次のとおりです。

C#
2026/06/13
15:30:45

間違った例は次のとおりです。

C#
Console.WriteLine(dt.ToString("yyyy/mm/dd"));

出力結果は次のようになります。

C#
2026/30/13

mm は分なので、月ではなく 30 が表示されています。

日付は yyyy/MM/dd、時刻は HH:mm:ss とセットで覚えるのがおすすめです。

11-5. 書式指定しても表示が変わらない原因は?

書式指定しても表示が変わらない場合、次のような原因が考えられます。

原因
書式指定した結果を使っていないvalue.ToString("N0"); だけ書いている
対象の型が違う文字列に数値書式を指定している
カルチャの影響小数点や通貨表示が想定と違う
書式指定子のミスMMmm を間違えている
表示箇所で別の値を使っている整形前の値を出力している

よくあるミスは、ToStringの戻り値を使っていないケースです。

C#
int value = 1000;

value.ToString("N0");
Console.WriteLine(value);

このコードでは、出力は次のようになります。

C#
1000

ToString("N0")の結果を変数に入れるか、そのまま出力する必要があります。

C#
int value = 1000;

Console.WriteLine(value.ToString("N0"));

出力結果は次のとおりです。

C#
1,000

11-6. C#で書式指定を一覧で確認する方法は?

C#の書式指定は、大きく分けて数値書式と日付時刻書式があります。

数値書式でよく使うものは次のとおりです。

書式内容
D4整数の0埋め0001
N0桁区切り、小数なし1,000
N2桁区切り、小数2桁1,000.00
F2小数2桁1000.00
C0通貨、小数なし¥1,000
P2パーセント、小数2桁12.34%
X16進数FF

日付時刻書式でよく使うものは次のとおりです。

書式内容
yyyy/MM/dd年月日2026/06/13
yyyy-MM-ddハイフン区切り日付2026-06-13
HH:mm:ss時分秒15:30:45
yyyy/MM/dd HH:mm:ss日時2026/06/13 15:30:45
yyyyMMddHHmmss連続した日時20260613153045
yyyy年MM月dd日日本語日付2026年06月13日
yyyy年MM月dd日(ddd)曜日付き日付2026年06月13日(土)

実務では、まずこの一覧を覚えておけば、多くのケースに対応できます。

まとめ

C#の書式指定を使うと、数値、日付、時刻、文字列を用途に合わせて分かりやすく表示できます。

基本的な書き方は次の3つです。

C#
string.Format("{0:N0}", value);
value.ToString("N0");
$"{value:N0}";

複数の値を埋め込む場合は string.Format または文字列補間、1つの値を整形する場合は ToString("書式") が便利です。

現在のC#では、可読性の高い文字列補間がよく使われます。

C#
int price = 1000;
DateTime date = new DateTime(2026, 6, 13);

string text = $"金額は{price:N0}円、日付は{date:yyyy/MM/dd}です。";

数値書式では、次の指定子をよく使います。

C#
D4   // 0001 のような0埋め
N0 // 1,000 のような桁区切り
F2 // 小数点以下2桁
C0 // 通貨表示
P2 // パーセント表示
X // 16進数

日付時刻書式では、次の指定子が重要です。

C#
yyyy/MM/dd
HH:mm:ss
yyyy-MM-dd HH:mm:ss
yyyy年MM月dd日
yyyyMMddHHmmss

特に、月の MM と分の mm の違いには注意が必要です。

C#
date.ToString("yyyy/MM/dd"); // 正しい
date.ToString("yyyy/mm/dd"); // mmは分なので注意

また、通貨、小数点、曜日、日付形式はカルチャの影響を受けるため、必要に応じて CultureInfo を明示しましょう。

C#
using System.Globalization;

price.ToString("C", new CultureInfo("ja-JP"));
date.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);

C#の書式指定は、画面表示、ログ出力、CSV、帳票、金額表示、日付表示など、実務で頻繁に使う基本機能です。

string.FormatToString、文字列補間、標準書式、カスタム書式、CultureInfoを正しく使い分けることで、読みやすく、保守しやすく、環境差に強いコードを書けるようになります。