C# Format完全ガイド|String.Formatの使い方・書式指定子・0埋め・日付/数値変換を実例で解説
はじめに
C#で文字列、数値、日付を見やすく表示したいときに欠かせないのが「Format」です。たとえば、金額を「1,234円」のようにカンマ区切りで表示したり、会員番号を「000123」のように0埋めしたり、日付を「2026/06/11」のような固定形式に変換したりできます。
C#のFormatには、String.Format、文字列補間 $""、ToString など複数の書き方があります。どれも「値を文字列として整形する」という目的は同じですが、使いどころが少しずつ異なります。
この記事では、C# Formatの基本から、書式指定子、0埋め、日付変換、数値変換、エラー対処まで、実務で使いやすい形で解説します。Microsoft Learnでも、標準数値書式指定文字列や日時書式指定文字列は、数値や日時をテキスト表現に変換するための仕組みとして説明されています。
1. C#のFormatとは?文字列・数値・日付を整形する基本
C#におけるFormatとは、値を人が読みやすい文字列に整形する処理のことです。
たとえば、プログラム内部では数値が 1234567 として扱われていても、画面に表示するときは 1,234,567 のようにカンマを付けた方が読みやすくなります。
C#int price = 1234567;
string result = String.Format("{0:N0}", price);
Console.WriteLine(result);
出力結果は次のようになります。
C#1,234,567
このように、C# Formatは「データそのものを変える」のではなく、「表示用の文字列に変換する」ために使います。
1-1. C# Formatでできること
C# Formatを使うと、主に次のような整形ができます。
C#int number = 1234;
double rate = 0.256;
DateTime today = new DateTime(2026, 6, 11);
Console.WriteLine(String.Format("{0:N0}", number));
Console.WriteLine(String.Format("{0:P1}", rate));
Console.WriteLine(String.Format("{0:yyyy/MM/dd}", today));
出力例は次のとおりです。
C#1,234
25.6%
2026/06/11
代表的な用途は、数値のカンマ区切り、小数点以下の桁数指定、通貨表示、パーセント表示、0埋め、日付・時刻の表示形式変更、ログやメッセージの組み立てなどです。
1-2. String.Format・補間文字列・ToStringの違い
C#で値を整形する方法として、よく使われるのが次の3つです。
C#string name = "田中";
int score = 85;
// String.Format
string message1 = String.Format("{0}さんの点数は{1}点です。", name, score);
// 文字列補間
string message2 = $"{name}さんの点数は{score}点です。";
// ToString
string message3 = score.ToString("D3");
String.Format は、文字列の中に {0} や {1} のようなプレースホルダーを置き、後ろから値を差し込みます。
文字列補間 $"" は、文字列の中に変数名を直接書けるため、読みやすいのが特徴です。Microsoft Learnでも、文字列補間は従来の複合書式指定より読み取りやすく便利な構文として説明されています。
ToString は、1つの値を単体で整形して文字列にしたいときに便利です。
1-3. どの書き方を使うべきか早見表
実務では、次のように使い分けると分かりやすいです。
| やりたいこと | おすすめ |
|---|---|
| 文字列の中に変数を埋め込みたい | 文字列補間 $"" |
| 複数の値をテンプレートに差し込みたい | String.Format |
| 数値や日付を単体で整形したい | ToString |
| 古いコードや共通テンプレートを扱う | String.Format |
| 可読性を重視したい | 文字列補間 $"" |
たとえば、新しくコードを書く場合は文字列補間が読みやすく、既存コードや共通メッセージテンプレートでは String.Format が使いやすい場面があります。
1-4. 初心者が混乱しやすい「format」の意味
初心者が混乱しやすいのは、C#の「format」が1つの機能名だけを指すわけではない点です。
String.Format のようなメソッド名として使われることもあれば、"{0:N2}" の N2 のような書式指定を指すこともあります。また、date.ToString("yyyy/MM/dd") の "yyyy/MM/dd" もフォーマット文字列です。
つまり、C#で「format」と言う場合は、主に次の意味があります。
| 意味 | 例 |
|---|---|
| 文字列を組み立てるメソッド | String.Format(...) |
| 値の表示形式 | "N2", "yyyy/MM/dd" |
| 書式指定子 | C, D, N, P, yyyy, MM |
| 表示用に整形する処理全般 | 金額表示、日付表示、0埋めなど |
2. String.Formatの基本構文と使い方
String.Format は、C#で文字列を整形する代表的なメソッドです。指定した書式文字列の中に値を埋め込み、完成した文字列を返します。
2-1. String.Formatの基本構文
基本構文は次のとおりです。
C#String.Format("文字列 {0} 文字列 {1}", 値0, 値1);
具体例を見てみましょう。
C#string name = "佐藤";
int age = 30;
string text = String.Format("{0}さんは{1}歳です。", name, age);
Console.WriteLine(text);
出力結果は次のようになります。
C#佐藤さんは30歳です。
{0} には1つ目の値である name が入り、{1} には2つ目の値である age が入ります。
2-2. プレースホルダー「{0}」「{1}」の意味
String.Format の {0} や {1} は、プレースホルダーと呼ばれます。プレースホルダーは「ここに値を入れる」という目印です。
C#string result = String.Format("商品名: {0}, 価格: {1}円", "ノート", 120);
出力結果は次のとおりです。
C#商品名: ノート, 価格: 120円
番号は0から始まります。
C#{0} // 1つ目の値
{1} // 2つ目の値
{2} // 3つ目の値
この番号を間違えると、意図した値が入らなかったり、エラーになったりします。
2-3. 複数の値を埋め込む方法
複数の値を埋め込む場合は、プレースホルダーの番号を増やします。
C#string product = "ペン";
int quantity = 3;
int price = 150;
string message = String.Format(
"{0}を{1}本購入しました。合計金額は{2}円です。",
product,
quantity,
quantity * price
);
Console.WriteLine(message);
出力結果は次のとおりです。
C#ペンを3本購入しました。合計金額は450円です。
String.Format では、計算式の結果をそのまま渡すこともできます。
2-4. 同じ値を複数回使う方法
同じ値を複数回使いたい場合は、同じ番号のプレースホルダーを何度も書けます。
C#string name = "山田";
string message = String.Format("{0}さん、こんにちは。{0}さんの登録が完了しました。", name);
Console.WriteLine(message);
出力結果は次のようになります。
C#山田さん、こんにちは。山田さんの登録が完了しました。
このように、{0} を複数回使えば、同じ値を何度でも埋め込めます。
2-5. 中括弧「{ }」を文字として表示する方法
String.Format では { と } がプレースホルダーの記号として使われます。そのため、中括弧そのものを表示したい場合は、二重に書きます。
C#string result = String.Format("{{0}} はプレースホルダーの例です。");
Console.WriteLine(result);
出力結果は次のとおりです。
C#{0} はプレースホルダーの例です。
開始波括弧は {{、終了波括弧は }} と書くのがポイントです。
2-6. String.Formatでよくあるエラーと原因
String.Format でよくあるエラーは、FormatException です。
たとえば、次のコードはエラーになります。
C#string text = String.Format("名前: {0}, 年齢: {1}", "田中");
{1} があるのに、2つ目の値が渡されていないためです。
また、次のように中括弧の対応が崩れている場合もエラーになります。
C#string text = String.Format("値は {0 です", 100);
正しくは次のように書きます。
C#string text = String.Format("値は {0} です", 100);
String.Format のエラーは、多くの場合「プレースホルダー番号」「中括弧」「書式指定子」のどれかに原因があります。
3. C#の書式指定子の基本
C# Formatを使いこなすには、書式指定子を理解することが重要です。書式指定子を使うと、数値や日付の表示形式を細かく制御できます。
3-1. 書式指定子とは何か
書式指定子とは、値をどのような形式で文字列化するかを指定する記号です。
たとえば、次の N0 が書式指定子です。
C#int number = 1234567;
string result = String.Format("{0:N0}", number);
Console.WriteLine(result);
出力結果は次のようになります。
C#1,234,567
N は数値形式、0 は小数点以下0桁を意味します。
日付の場合は、次のように書きます。
C#DateTime date = new DateTime(2026, 6, 11);
string result = String.Format("{0:yyyy/MM/dd}", date);
Console.WriteLine(result);
出力結果は次のとおりです。
C#2026/06/11
3-2. 標準書式指定子とカスタム書式指定子の違い
書式指定子には、大きく分けて「標準書式指定子」と「カスタム書式指定子」があります。
標準書式指定子は、C、D、N、P など、あらかじめ用意された短い指定子です。Microsoft Learnでは、標準数値書式指定文字列は [書式指定子][精度指定子] の形を取ると説明されています。
C#int number = 1234;
Console.WriteLine(number.ToString("N0"));
Console.WriteLine(number.ToString("D6"));
出力例は次のとおりです。
C#1,234
001234
一方、カスタム書式指定子は、自分で表示形式を細かく指定する方法です。
C#int number = 1234;
Console.WriteLine(number.ToString("000000"));
Console.WriteLine(number.ToString("#,0"));
出力結果は次のとおりです。
C#001234
1,234
日付でも同じです。
C#DateTime date = new DateTime(2026, 6, 11);
Console.WriteLine(date.ToString("D"));
Console.WriteLine(date.ToString("yyyy年MM月dd日"));
"D" は標準書式指定子、"yyyy年MM月dd日" はカスタム書式指定子です。日時の標準書式指定文字列は単一の文字で表され、複数文字を含む日時書式文字列はカスタム書式として扱われます。
3-3. 書式指定の基本形「{index,alignment:formatString}」
String.Format の書式指定は、次の形で書けます。
C#{index,alignment:formatString}
それぞれの意味は次のとおりです。
| 要素 | 意味 |
|---|---|
index | 何番目の値を使うか |
alignment | 桁幅、右寄せ、左寄せ |
formatString | 数値や日付の表示形式 |
たとえば、次のように書きます。
C#int number = 123;
string result = String.Format("|{0,10:D5}|", number);
Console.WriteLine(result);
出力結果は次のようになります。
C#| 00123|
{0,10:D5} は「0番目の値を、幅10で右寄せし、5桁の0埋めで表示する」という意味です。
3-4. 桁揃え・右寄せ・左寄せの指定方法
桁揃えを指定するには、プレースホルダー内でカンマの後に幅を書きます。
C#Console.WriteLine(String.Format("|{0,10}|", "ABC"));
Console.WriteLine(String.Format("|{0,-10}|", "ABC"));
出力結果は次のとおりです。
C#| ABC|
|ABC |
正の数を指定すると右寄せ、負の数を指定すると左寄せになります。
表形式の出力でよく使います。
C#Console.WriteLine(String.Format("{0,-10} {1,8}", "商品", "価格"));
Console.WriteLine(String.Format("{0,-10} {1,8:N0}", "ペン", 120));
Console.WriteLine(String.Format("{0,-10} {1,8:N0}", "ノート", 1500));
出力例は次のとおりです。
C#商品 価格
ペン 120
ノート 1,500
3-5. カルチャによる表示形式の違い
C#のFormatでは、カルチャによって表示形式が変わることがあります。
たとえば、通貨記号、桁区切り、小数点記号、日付の並び順などは、カルチャの影響を受けます。
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
日本向けの表示を固定したい場合は CultureInfo("ja-JP")、システムやデータ連携で地域差を避けたい場合は CultureInfo.InvariantCulture を検討します。
4. 数値をFormatする方法
数値のFormatは、C#で特によく使います。金額、数量、割合、ID、集計結果など、画面表示や帳票出力で頻出します。
4-1. 数値をカンマ区切りで表示する
数値をカンマ区切りで表示するには、N0 を使うのが簡単です。
C#int amount = 1234567;
Console.WriteLine(String.Format("{0:N0}", amount));
出力結果は次のとおりです。
C#1,234,567
小数点以下も表示したい場合は、N2 のように桁数を指定します。
C#double amount = 1234567.89;
Console.WriteLine(String.Format("{0:N2}", amount));
出力結果は次のようになります。
C#1,234,567.89
4-2. 小数点以下の桁数を指定する
小数点以下の桁数を指定するには、F または N を使います。
C#double value = 12.3456;
Console.WriteLine(value.ToString("F2"));
Console.WriteLine(value.ToString("N2"));
出力結果は次のとおりです。
C#12.35
12.35
F2 は固定小数点形式、N2 は数値形式です。大きな数値では N2 の方が桁区切りが入るため見やすくなります。
C#double value = 12345.678;
Console.WriteLine(value.ToString("F2"));
Console.WriteLine(value.ToString("N2"));
出力結果は次のようになります。
C#12345.68
12,345.68
4-3. 通貨形式で表示する
通貨形式で表示するには、C を使います。
C#decimal price = 1234.56m;
Console.WriteLine(price.ToString("C"));
出力例は、実行環境のカルチャによって変わります。
C#¥1,235
小数点以下の桁数を指定したい場合は、C2 のように書きます。
C#decimal price = 1234.56m;
Console.WriteLine(price.ToString("C2"));
出力例は次のとおりです。
C#¥1,234.56
日本円の表示を明示したい場合は、カルチャを指定します。
C#using System.Globalization;
decimal price = 1234.56m;
string result = price.ToString("C", new CultureInfo("ja-JP"));
Console.WriteLine(result);
4-4. パーセント形式で表示する
パーセント形式で表示するには、P を使います。
C#double rate = 0.256;
Console.WriteLine(rate.ToString("P1"));
出力結果は次のようになります。
C#25.6%
P は値を100倍してパーセント記号を付けます。
C#double rate = 25.6;
Console.WriteLine(rate.ToString("P1"));
この場合、出力は次のようになってしまいます。
C#2,560.0%
P を使うときは、0.256 のように割合を小数で持っているか確認しましょう。
4-5. 0埋めで桁数をそろえる
0埋めは、会員番号、注文番号、連番、コード値などでよく使います。
C#int id = 123;
Console.WriteLine(id.ToString("D6"));
出力結果は次のとおりです。
C#000123
D6 は、整数を6桁で表示し、足りない桁を0で埋める指定です。
カスタム書式指定子でも0埋めできます。
C#int id = 123;
Console.WriteLine(id.ToString("000000"));
出力結果は同じです。
C#000123
String.Format で書く場合は次のようになります。
C#int id = 123;
string code = String.Format("{0:D6}", id);
Console.WriteLine(code);
4-6. 正負の数値を条件別に表示する
カスタム数値書式では、正の数、負の数、ゼロで表示形式を分けられます。
C#int value1 = 100;
int value2 = -100;
int value3 = 0;
string format = "+#,0;-#,0;0";
Console.WriteLine(value1.ToString(format));
Console.WriteLine(value2.ToString(format));
Console.WriteLine(value3.ToString(format));
出力結果は次のとおりです。
C#+100
-100
0
書式はセミコロンで区切ります。
C#正の数の書式;負の数の書式;ゼロの書式
たとえば、差分表示でプラス記号を明示したいときに便利です。
4-7. 数値Formatの実例一覧
数値Formatでよく使う例をまとめます。
| 目的 | コード | 出力例 |
|---|---|---|
| カンマ区切り | 1234567.ToString("N0") | 1,234,567 |
| 小数2桁 | 12.345.ToString("F2") | 12.35 |
| カンマ区切り小数2桁 | 12345.678.ToString("N2") | 12,345.68 |
| 0埋め6桁 | 123.ToString("D6") | 000123 |
| パーセント1桁 | 0.256.ToString("P1") | 25.6% |
| 通貨 | 1234.ToString("C") | ¥1,234 |
| カスタムカンマ | 1234567.ToString("#,0") | 1,234,567 |
| 正負表示 | 100.ToString("+#;-#;0") | +100 |
5. 日付・時刻をFormatする方法
日付や時刻のFormatは、ファイル名、画面表示、ログ、帳票、API連携などでよく使います。C#では DateTime の値に対して、標準書式指定子やカスタム書式指定子を使って文字列化できます。
5-1. DateTimeを任意の形式で文字列化する
DateTime を任意の形式にするには、ToString または String.Format を使います。
C#DateTime date = new DateTime(2026, 6, 11, 15, 30, 45);
Console.WriteLine(date.ToString("yyyy/MM/dd"));
Console.WriteLine(String.Format("{0:yyyy-MM-dd HH:mm:ss}", date));
出力結果は次のとおりです。
C#2026/06/11
2026-06-11 15:30:45
日時のカスタム書式では、yyyy、MM、dd、HH、mm、ss などを組み合わせます。Microsoft Learnでも、カスタム日時書式指定文字列は1つ以上のカスタム日時書式指定子で構成されると説明されています。
5-2. yyyy/MM/dd形式で表示する
日付を yyyy/MM/dd 形式で表示する例です。
C#DateTime date = new DateTime(2026, 6, 11);
string result = date.ToString("yyyy/MM/dd");
Console.WriteLine(result);
出力結果は次のようになります。
C#2026/06/11
yyyy は4桁の年、MM は2桁の月、dd は2桁の日を表します。
スラッシュではなくハイフンにしたい場合は、次のようにします。
C#string result = date.ToString("yyyy-MM-dd");
出力結果は次のとおりです。
C#2026-06-11
5-3. 年月日・曜日を日本語で表示する
年月日を日本語形式で表示するには、次のように書きます。
C#DateTime date = new DateTime(2026, 6, 11);
Console.WriteLine(date.ToString("yyyy年MM月dd日"));
出力結果は次のとおりです。
C#2026年06月11日
曜日を表示するには、ddd または dddd を使います。
C#using System.Globalization;
DateTime date = new DateTime(2026, 6, 11);
CultureInfo culture = new CultureInfo("ja-JP");
Console.WriteLine(date.ToString("yyyy年MM月dd日(ddd)", culture));
Console.WriteLine(date.ToString("yyyy年MM月dd日 dddd", culture));
出力例は次のようになります。
C#2026年06月11日(木)
2026年06月11日 木曜日
ddd は短い曜日名、dddd は長い曜日名です。
5-4. 時分秒を表示する
時刻を表示するには、HH、mm、ss を使います。
C#DateTime date = new DateTime(2026, 6, 11, 15, 30, 45);
Console.WriteLine(date.ToString("HH:mm:ss"));
出力結果は次のとおりです。
C#15:30:45
日付と時刻をまとめて表示する場合は、次のように書きます。
C#Console.WriteLine(date.ToString("yyyy/MM/dd HH:mm:ss"));
出力結果は次のようになります。
C#2026/06/11 15:30:45
5-5. 12時間表記と24時間表記の違い
C#の日付Formatでは、時刻の指定子に注意が必要です。
| 指定子 | 意味 | 例 |
|---|---|---|
HH | 24時間表記 | 15 |
hh | 12時間表記 | 03 |
tt | AM/PM | PM |
C#DateTime date = new DateTime(2026, 6, 11, 15, 30, 0);
Console.WriteLine(date.ToString("HH:mm"));
Console.WriteLine(date.ToString("hh:mm tt"));
出力例は次のとおりです。
C#15:30
03:30 PM
24時間表記にしたい場合は HH、12時間表記にしたい場合は hh を使います。
5-6. DateTime.NowをFormatする実例
現在日時をFormatするには、DateTime.Now を使います。
C#DateTime now = DateTime.Now;
Console.WriteLine(now.ToString("yyyy/MM/dd HH:mm:ss"));
出力例は次のとおりです。
C#2026/06/11 09:15:30
ログ出力では次のような形式がよく使われます。
C#string logTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
Console.WriteLine(logTime);
出力例は次のようになります。
C#2026-06-11 09:15:30.123
fff はミリ秒を表します。
ファイル名に使う場合は、スラッシュやコロンを避けます。
C#string fileName = DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".log";
Console.WriteLine(fileName);
出力例は次のとおりです。
C#20260611_091530.log
5-7. 日付Formatでよくある間違い
日付Formatで特に多い間違いは、MM と mm の混同です。
C#DateTime date = new DateTime(2026, 6, 11, 15, 30, 0);
Console.WriteLine(date.ToString("yyyy/mm/dd"));
このコードは、月ではなく分を表示してしまいます。
正しくは次のように書きます。
C#Console.WriteLine(date.ToString("yyyy/MM/dd"));
主な違いは次のとおりです。
| 指定子 | 意味 |
|---|---|
MM | 月 |
mm | 分 |
dd | 日 |
DD | C#のカスタム日時書式としては一般的な「日」ではない |
yyyy | 4桁の年 |
YYYY | C#のカスタム日時書式では年として使わない |
C#では、年は yyyy、月は MM、日は dd、分は mm と覚えましょう。
6. 文字列補間とFormatの使い分け
現在のC#では、文字列を組み立てる場面で文字列補間 $"" がよく使われます。ただし、String.Format が不要になったわけではありません。用途に応じて使い分けることが大切です。
6-1. 文字列補間「$""」の基本
文字列補間は、文字列の前に $ を付け、文字列内に {変数名} を書く方法です。
C#string name = "田中";
int age = 30;
string message = $"{name}さんは{age}歳です。";
Console.WriteLine(message);
出力結果は次のとおりです。
C#田中さんは30歳です。
String.Format と比べると、どの位置にどの変数が入るかが直感的に分かります。
6-2. 文字列補間で書式指定する方法
文字列補間でも、String.Format と同じように書式指定ができます。
C#int amount = 1234567;
DateTime date = new DateTime(2026, 6, 11);
Console.WriteLine($"{amount:N0}");
Console.WriteLine($"{date:yyyy/MM/dd}");
出力結果は次のとおりです。
C#1,234,567
2026/06/11
桁揃えもできます。
C#string name = "Pen";
int price = 120;
Console.WriteLine($"|{name,-10}|{price,8:N0}|");
出力例は次のようになります。
C#|Pen | 120|
6-3. String.Formatより文字列補間が向いているケース
文字列補間が向いているのは、コード内で直接メッセージを組み立てる場合です。
C#string userName = "佐藤";
int point = 1200;
string message = $"{userName}さんの現在のポイントは{point:N0}ptです。";
このコードは、どの変数がどこに表示されるかが分かりやすいです。
String.Format で書くと次のようになります。
C#string message = String.Format("{0}さんの現在のポイントは{1:N0}ptです。", userName, point);
短い文なら問題ありませんが、値が増えるほど {0}、{1}、{2} の対応関係を追う必要があります。
6-4. String.Formatが便利なケース
String.Format が便利なのは、テンプレート文字列と値を分けて扱いたい場合です。
C#string template = "{0}さんの現在のポイントは{1:N0}ptです。";
string message = String.Format(template, "佐藤", 1200);
Console.WriteLine(message);
たとえば、メッセージテンプレートを設定ファイルやデータベースで管理している場合、String.Format は扱いやすいです。
また、既存システムでは String.Format が広く使われていることも多いため、読み書きできるようにしておく価値があります。
6-5. 可読性・保守性・パフォーマンスの比較
可読性では、一般的に文字列補間が有利です。
C#string message = $"{name}さんの点数は{score}点です。";
変数名が直接見えるため、読み間違いが少なくなります。
保守性でも、値の順番を入れ替えたときにプレースホルダー番号を修正する必要がないため、文字列補間の方が扱いやすい場面が多いです。
一方で、メッセージテンプレートを外部化する場合や、既存のテンプレート文字列を再利用する場合は、String.Format が便利です。
パフォーマンスについては、通常の画面表示やログ出力では、可読性を優先して問題ないケースがほとんどです。ただし、大量ループ内で文字列を繰り返し結合するような処理では、StringBuilder やログライブラリの遅延評価なども検討します。
6-6. 実務ではどちらを使うべきか
新しくC#コードを書くなら、基本は文字列補間を使うのがおすすめです。
C#string message = $"{userName}さん、こんにちは。";
ただし、次のような場合は String.Format も選択肢になります。
| ケース | おすすめ |
|---|---|
| 通常のメッセージ作成 | 文字列補間 |
| 変数名を見せて可読性を高めたい | 文字列補間 |
| テンプレートを外部管理する | String.Format |
既存コードが String.Format 中心 | String.Format |
| 値を1つだけ整形する | ToString |
実務では「文字列補間を基本にしつつ、テンプレート処理では String.Format、単体整形では ToString」と考えると迷いにくくなります。
7. ToStringでFormatする方法
ToString は、数値や日付などの値を文字列に変換するメソッドです。書式文字列を渡すことで、表示形式を指定できます。
7-1. 数値のToStringフォーマット
数値に対して ToString を使う例です。
C#int number = 1234567;
Console.WriteLine(number.ToString("N0"));
Console.WriteLine(number.ToString("D10"));
出力結果は次のとおりです。
C#1,234,567
0001234567
小数の場合も同じです。
C#double value = 12.3456;
Console.WriteLine(value.ToString("F2"));
Console.WriteLine(value.ToString("P1"));
出力結果は次のようになります。
C#12.35
1,234.6%
P は値を100倍するため、12.3456 を指定すると 1,234.6% になります。割合として表示したい場合は、元の値が 0.123456 のような小数になっているか確認しましょう。
7-2. DateTimeのToStringフォーマット
DateTime でも ToString に書式文字列を渡せます。
C#DateTime date = new DateTime(2026, 6, 11, 15, 30, 45);
Console.WriteLine(date.ToString("yyyy/MM/dd"));
Console.WriteLine(date.ToString("HH:mm:ss"));
Console.WriteLine(date.ToString("yyyyMMdd_HHmmss"));
出力結果は次のとおりです。
C#2026/06/11
15:30:45
20260611_153045
DateTime.ToString(String) は、指定した形式で日時の文字列表現を返すメソッドです。
7-3. String.Formatとの違い
ToString と String.Format の違いは、整形対象の数です。
ToString は、1つの値を文字列化するのに向いています。
C#int id = 123;
string code = id.ToString("D6");
一方、String.Format は複数の値を組み合わせた文字列を作るのに向いています。
C#int id = 123;
string name = "田中";
string message = String.Format("ID:{0:D6} 名前:{1}", id, name);
7-4. 変数単体を整形するならToStringが便利
変数を単体で整形したいだけなら、ToString が最もシンプルです。
C#decimal price = 1200m;
string text = price.ToString("N0");
日付でも同じです。
C#DateTime today = DateTime.Today;
string text = today.ToString("yyyy/MM/dd");
このように、値を1つだけ変換する場合は ToString を使うとコードが短くなります。
7-5. 複数の値を組み合わせるならString.Formatが便利
複数の値を1つの文章にまとめる場合は、String.Format や文字列補間が便利です。
C#string name = "田中";
int point = 1500;
DateTime date = new DateTime(2026, 6, 11);
string message = String.Format(
"{0}さんのポイントは{1:N0}ptです。更新日: {2:yyyy/MM/dd}",
name,
point,
date
);
Console.WriteLine(message);
出力結果は次のようになります。
C#田中さんのポイントは1,500ptです。更新日: 2026/06/11
同じ内容を文字列補間で書くと次のようになります。
C#string message = $"{name}さんのポイントは{point:N0}ptです。更新日: {date:yyyy/MM/dd}";
どちらでも結果は同じです。新規コードでは文字列補間、テンプレート文字列を使う場合は String.Format と使い分けるとよいでしょう。
8. C# Formatの実用例
ここでは、実務でそのまま使いやすいC# Formatの例を紹介します。
8-1. ログメッセージを整形する
ログでは、日時、ログレベル、メッセージを一定の形式で出力することが多いです。
C#DateTime now = DateTime.Now;
string level = "INFO";
string message = "処理を開始しました。";
string log = String.Format("[{0:yyyy-MM-dd HH:mm:ss}] [{1}] {2}", now, level, message);
Console.WriteLine(log);
出力例は次のとおりです。
C#[2026-06-11 09:30:00] [INFO] 処理を開始しました。
文字列補間で書く場合は次のようになります。
C#string log = $"[{now:yyyy-MM-dd HH:mm:ss}] [{level}] {message}";
8-2. 請求金額を通貨形式で表示する
請求金額を表示する場合、カンマ区切りや通貨記号を付けると分かりやすくなります。
C#using System.Globalization;
decimal amount = 123456m;
string text = amount.ToString("C", new CultureInfo("ja-JP"));
Console.WriteLine(text);
出力例は次のとおりです。
C#¥123,456
通貨記号を使わず「円」を付けたい場合は、次のように書きます。
C#decimal amount = 123456m;
string text = $"{amount:N0}円";
Console.WriteLine(text);
出力結果は次のとおりです。
C#123,456円
8-3. 会員番号や注文番号を0埋めする
会員番号や注文番号を固定桁数で表示する場合は、D または 0 を使います。
C#int memberId = 123;
string memberCode = memberId.ToString("D8");
Console.WriteLine(memberCode);
出力結果は次のとおりです。
C#00000123
注文番号に接頭辞を付ける場合は、次のように書けます。
C#int orderId = 456;
string orderNo = $"ORD-{orderId:D10}";
Console.WriteLine(orderNo);
出力結果は次のとおりです。
C#ORD-0000000456
8-4. 日付付きファイル名を作成する
日付付きファイル名では、ファイル名に使えない文字を避ける必要があります。スラッシュ / やコロン : は避け、yyyyMMdd_HHmmss のような形式にすると扱いやすいです。
C#string fileName = $"log_{DateTime.Now:yyyyMMdd_HHmmss}.txt";
Console.WriteLine(fileName);
出力例は次のとおりです。
C#log_20260611_093000.txt
年月日だけでよい場合は、次のようにします。
C#string fileName = $"report_{DateTime.Now:yyyyMMdd}.csv";
出力例は次のとおりです。
C#report_20260611.csv
8-5. 表形式の出力を桁揃えする
コンソールに表形式で出力する場合は、alignment指定が便利です。
C#Console.WriteLine(String.Format("{0,-10} {1,10} {2,10}", "商品", "数量", "金額"));
Console.WriteLine(String.Format("{0,-10} {1,10:N0} {2,10:N0}", "ペン", 3, 360));
Console.WriteLine(String.Format("{0,-10} {1,10:N0} {2,10:N0}", "ノート", 12, 1800));
出力例は次のとおりです。
C#商品 数量 金額
ペン 3 360
ノート 12 1,800
左寄せは -10、右寄せは 10 のように指定します。
8-6. CSV出力や画面表示で使うFormat例
CSV出力では、日付や数値を一定形式にそろえると後続処理がしやすくなります。
C#DateTime date = new DateTime(2026, 6, 11);
int quantity = 5;
decimal amount = 12345m;
string csv = String.Format("{0:yyyy-MM-dd},{1},{2}", date, quantity, amount);
Console.WriteLine(csv);
出力結果は次のとおりです。
C#2026-06-11,5,12345
画面表示では、読みやすさを優先してカンマ区切りにすることが多いです。
C#string display = $"日付: {date:yyyy/MM/dd} 数量: {quantity:N0} 金額: {amount:N0}円";
Console.WriteLine(display);
出力結果は次のようになります。
C#日付: 2026/06/11 数量: 5 金額: 12,345円
CSVでは機械処理しやすい形式、画面では人が読みやすい形式にするのがポイントです。
9. C# Formatでよく使う書式指定子一覧
ここでは、C# Formatでよく使う書式指定子を一覧でまとめます。
9-1. 数値の標準書式指定子一覧
数値の標準書式指定子には、次のようなものがあります。
| 指定子 | 意味 | 例 |
|---|---|---|
C | 通貨 | 1234.ToString("C") |
D | 10進整数、0埋め可能 | 123.ToString("D5") |
E | 指数表記 | 1234.5.ToString("E2") |
F | 固定小数点 | 12.345.ToString("F2") |
N | 数値、桁区切り | 1234567.ToString("N0") |
P | パーセント | 0.25.ToString("P0") |
X | 16進数 | 255.ToString("X") |
標準数値書式指定子は、一般的な数値型を文字列として整形するために使われます。
9-2. 数値のカスタム書式指定子一覧
数値のカスタム書式指定子では、0、#、,、. などを組み合わせます。
| 指定子 | 意味 | 例 |
|---|---|---|
0 | 桁がない場合も0を表示 | 123.ToString("00000") → 00123 |
# | 桁がある場合だけ表示 | 123.ToString("#####") → 123 |
, | 桁区切り | 1234567.ToString("#,0") → 1,234,567 |
. | 小数点 | 12.3.ToString("0.00") → 12.30 |
% | パーセント | 0.25.ToString("0.0%") → 25.0% |
; | 正・負・ゼロの書式分岐 | "+0;-0;0" |
カスタム数値書式指定文字列を使うと、数値データの表示方法を細かく定義できます。
9-3. 日付・時刻の標準書式指定子一覧
日付・時刻の標準書式指定子には、次のようなものがあります。
| 指定子 | 意味 | 例 |
|---|---|---|
d | 短い日付 | 2026/06/11 |
D | 長い日付 | 2026年6月11日 |
t | 短い時刻 | 15:30 |
T | 長い時刻 | 15:30:45 |
f | 長い日付と短い時刻 | 2026年6月11日 15:30 |
F | 長い日付と長い時刻 | 2026年6月11日 15:30:45 |
g | 短い日付と短い時刻 | 2026/06/11 15:30 |
G | 短い日付と長い時刻 | 2026/06/11 15:30:45 |
o | ラウンドトリップ形式 | 2026-06-11T15:30:45.0000000 |
s | ソート可能形式 | 2026-06-11T15:30:45 |
標準日時書式指定文字列は、DateTime、DateTimeOffset、DateOnly、TimeOnly などのテキスト表現を定義するために使われます。
9-4. 日付・時刻のカスタム書式指定子一覧
日付・時刻のカスタム書式指定子でよく使うものをまとめます。
| 指定子 | 意味 | 例 |
|---|---|---|
yyyy | 4桁の年 | 2026 |
yy | 2桁の年 | 26 |
MM | 2桁の月 | 06 |
M | 月 | 6 |
dd | 2桁の日 | 11 |
d | 日 | 11 |
ddd | 短い曜日名 | 木 |
dddd | 長い曜日名 | 木曜日 |
HH | 24時間表記の時 | 15 |
hh | 12時間表記の時 | 03 |
mm | 分 | 30 |
ss | 秒 | 45 |
fff | ミリ秒 | 123 |
tt | AM/PM | PM |
よく使う形式は次のとおりです。
C#DateTime now = DateTime.Now;
Console.WriteLine(now.ToString("yyyy/MM/dd"));
Console.WriteLine(now.ToString("yyyy-MM-dd HH:mm:ss"));
Console.WriteLine(now.ToString("yyyyMMdd_HHmmss"));
Console.WriteLine(now.ToString("yyyy年MM月dd日(ddd)"));
9-5. 0埋め・桁区切り・小数点指定の早見表
0埋め、桁区切り、小数点指定は特によく使います。
| 目的 | 書式 | 例 |
|---|---|---|
| 5桁0埋め | "D5" | 00123 |
| 8桁0埋め | "D8" | 00000123 |
| カスタム0埋め | "000000" | 000123 |
| カンマ区切り | "N0" | 1,234,567 |
| 小数点以下2桁 | "F2" | 12.35 |
| カンマ区切り小数2桁 | "N2" | 1,234.50 |
| パーセント1桁 | "P1" | 25.6% |
| 日付8桁 | "yyyyMMdd" | 20260611 |
| 日時ファイル名 | "yyyyMMdd_HHmmss" | 20260611_153045 |
9-6. コピペで使えるFormatサンプル集
よく使うC# Formatのサンプルをまとめます。
C#int number = 1234567;
int id = 123;
double rate = 0.256;
decimal price = 1234.56m;
DateTime now = DateTime.Now;
// 数値
Console.WriteLine($"{number:N0}");
Console.WriteLine($"{number:N2}");
// 0埋め
Console.WriteLine($"{id:D6}");
Console.WriteLine(id.ToString("000000"));
// パーセント
Console.WriteLine($"{rate:P1}");
// 通貨
Console.WriteLine($"{price:C}");
// 日付
Console.WriteLine($"{now:yyyy/MM/dd}");
Console.WriteLine($"{now:yyyy-MM-dd HH:mm:ss}");
Console.WriteLine($"{now:yyyyMMdd_HHmmss}");
// String.Format
Console.WriteLine(String.Format("ID:{0:D6} 金額:{1:N0}円", id, price));
// 桁揃え
Console.WriteLine(String.Format("|{0,-10}|{1,10:N0}|", "商品A", price));
10. C# Formatでエラーになる原因と対処法
C# Formatでエラーが発生する場合、原因はある程度パターン化されています。特に String.Format では、プレースホルダーの番号や中括弧の書き方に注意が必要です。
10-1. FormatExceptionが発生する原因
FormatException は、書式文字列が正しくないときによく発生します。
C#string result = String.Format("値は {0 です", 100);
このコードは {0} の閉じ括弧がないためエラーになります。
正しくは次のように書きます。
C#string result = String.Format("値は {0} です", 100);
また、存在しないプレースホルダー番号を指定した場合もエラーになります。
C#string result = String.Format("{0} {1}", "A");
{1} に対応する値がないため、正しく動作しません。
10-2. プレースホルダー番号の指定ミス
プレースホルダー番号は0から始まります。
C#string result = String.Format("{1}さん、こんにちは。", "田中");
このコードでは {1} を指定していますが、渡している値は1つだけです。1つ目の値を使う場合は {0} と書きます。
C#string result = String.Format("{0}さん、こんにちは。", "田中");
複数の値を使う場合も、番号と引数の位置を確認しましょう。
C#string result = String.Format("{0}さんは{1}歳です。", "田中", 30);
10-3. 中括弧のエスケープ忘れ
String.Format や文字列補間では、中括弧 {} は特別な意味を持ちます。そのため、文字として表示したい場合は二重にします。
C#string result = String.Format("{{name}} はテンプレート変数です。");
Console.WriteLine(result);
出力結果は次のとおりです。
C#{name} はテンプレート変数です。
文字列補間でも同じように書きます。
C#string result = $"{{name}} はテンプレート変数です。";
10-4. 書式指定子の大文字・小文字の違い
C#の書式指定子では、大文字と小文字で意味が変わることがあります。
特に日付では、MM と mm の違いに注意しましょう。
C#DateTime date = new DateTime(2026, 6, 11, 15, 30, 0);
Console.WriteLine(date.ToString("yyyy/MM/dd"));
Console.WriteLine(date.ToString("yyyy/mm/dd"));
1つ目は月を表示しますが、2つ目は分を表示してしまいます。
主な違いは次のとおりです。
| 指定子 | 意味 |
|---|---|
MM | 月 |
mm | 分 |
HH | 24時間表記 |
hh | 12時間表記 |
yyyy | 年 |
YYYY | C#の年指定としては使わない |
数値でも、D は整数の10進形式、d は日付の短い日付形式として使われるなど、対象の型によって意味が変わります。
10-5. null値をFormatするときの注意点
String.Format に null を渡した場合、表示上は空文字のようになります。
C#string name = null;
string result = String.Format("名前: {0}", name);
Console.WriteLine(result);
出力結果は次のようになります。
C#名前:
ただし、null の変数に対して直接 ToString を呼び出すと、NullReferenceException になる可能性があります。
C#string name = null;
// エラーになる
string result = name.ToString();
安全に扱うには、null合体演算子 ?? を使います。
C#string name = null;
string result = (name ?? "未設定").ToString();
Console.WriteLine(result);
出力結果は次のとおりです。
C#未設定
文字列補間でも、必要に応じて ?? を使うと安全です。
C#string message = $"名前: {name ?? "未設定"}";
10-6. 意図した表示にならないときの確認ポイント
Formatの結果が意図どおりにならないときは、次の点を確認しましょう。
| 確認ポイント | 例 |
|---|---|
| プレースホルダー番号は正しいか | {0}, {1} |
| 引数の数は足りているか | {1} があるのに値が1つだけ |
| 中括弧をエスケープしているか | {{, }} |
| 日付の大文字小文字は正しいか | MM と mm |
| 数値の元データは正しいか | P は100倍される |
| カルチャの影響を受けていないか | 通貨、日付、桁区切り |
nullを直接 ToString していないか | name?.ToString() や ?? を使う |
特に、日付の MM と mm、パーセントの元データ、通貨のカルチャ設定は、実務でも間違いやすいポイントです。
11. C# Formatに関するよくある質問
ここでは、C# Formatに関するよくある質問をまとめます。
11-1. String.Formatは古い書き方ですか?
String.Format は現在でも使える書き方です。ただし、新しくコードを書く場合は、文字列補間 $"" の方が読みやすいケースが多いです。
C#string name = "田中";
int score = 90;
string message = $"{name}さんの点数は{score}点です。";
一方で、テンプレート文字列を外部から読み込む場合や、既存コードで String.Format が使われている場合は、今でも有効です。
C#string template = "{0}さんの点数は{1}点です。";
string message = String.Format(template, name, score);
11-2. C#で0埋めするにはどう書きますか?
整数を0埋めするには、D を使います。
C#int id = 123;
string result = id.ToString("D6");
Console.WriteLine(result);
出力結果は次のとおりです。
C#000123
文字列補間なら次のように書けます。
C#string result = $"{id:D6}";
String.Format なら次のとおりです。
C#string result = String.Format("{0:D6}", id);
11-3. 日付をyyyyMMdd形式にするには?
DateTime に対して ToString("yyyyMMdd") を使います。
C#DateTime date = new DateTime(2026, 6, 11);
string result = date.ToString("yyyyMMdd");
Console.WriteLine(result);
出力結果は次のとおりです。
C#20260611
現在日付を使う場合は次のように書きます。
C#string result = DateTime.Now.ToString("yyyyMMdd");
ファイル名に使う場合にも便利です。
C#string fileName = $"report_{DateTime.Now:yyyyMMdd}.csv";
11-4. 小数点以下2桁で表示するには?
小数点以下2桁で表示するには、F2 または N2 を使います。
C#double value = 12.3456;
Console.WriteLine(value.ToString("F2"));
Console.WriteLine(value.ToString("N2"));
出力結果は次のとおりです。
C#12.35
12.35
大きい数値で桁区切りも付けたい場合は N2 が便利です。
C#double value = 12345.678;
Console.WriteLine(value.ToString("N2"));
出力結果は次のようになります。
C#12,345.68
11-5. カンマ区切りの数値にするには?
カンマ区切りにするには、N0 を使います。
C#int number = 1234567;
string result = number.ToString("N0");
Console.WriteLine(result);
出力結果は次のとおりです。
C#1,234,567
文字列補間なら次のように書けます。
C#string result = $"{number:N0}";
String.Format なら次のとおりです。
C#string result = String.Format("{0:N0}", number);
11-6. FormatとParseの違いは何ですか?
Formatは、数値や日付などの値を文字列に変換する処理です。
C#DateTime date = new DateTime(2026, 6, 11);
string text = date.ToString("yyyy/MM/dd");
この場合、DateTime を "2026/06/11" という文字列にしています。
一方、Parseは文字列を数値や日付などの型に変換する処理です。
C#string text = "2026/06/11";
DateTime date = DateTime.Parse(text);
つまり、方向が逆です。
C#Format: 値 → 文字列
Parse : 文字列 → 値
画面に表示するならFormat、入力された文字列をプログラムで扱う値に戻すならParseを使います。Microsoft Learnでも、日時文字列の解析は文字列から DateTime などを作成する技法として説明されています。
11-7. 日本語の曜日を表示するには?
日本語の曜日を表示するには、CultureInfo("ja-JP") を指定し、ddd または dddd を使います。
C#using System.Globalization;
DateTime date = new DateTime(2026, 6, 11);
CultureInfo culture = new CultureInfo("ja-JP");
string result = date.ToString("yyyy年MM月dd日(ddd)", culture);
Console.WriteLine(result);
出力結果は次のとおりです。
C#2026年06月11日(木)
長い曜日名にしたい場合は dddd を使います。
C#string result = date.ToString("yyyy年MM月dd日 dddd", culture);
Console.WriteLine(result);
出力結果は次のようになります。
C#2026年06月11日 木曜日
まとめ
C#のFormatは、数値、日付、文字列を見やすい形に整えるための重要な機能です。
String.Format を使うと、{0} や {1} のようなプレースホルダーに値を埋め込めます。数値や日付には、N0、F2、D6、yyyy/MM/dd などの書式指定子を使うことで、カンマ区切り、小数点指定、0埋め、日付変換が簡単にできます。
新しくコードを書く場合は、可読性の高い文字列補間 $"" を使うのがおすすめです。
C#string message = $"{name}さんの金額は{amount:N0}円です。";
一方で、テンプレート文字列を扱う場合や既存コードでは、String.Format もまだ十分に使われます。
C#string message = String.Format("{0}さんの金額は{1:N0}円です。", name, amount);
値を1つだけ整形するなら、ToString がシンプルです。
C#string text = amount.ToString("N0");
C# Formatで特に覚えておきたいポイントは、次のとおりです。
| 目的 | 書き方 |
|---|---|
| カンマ区切り | {value:N0} |
| 小数点以下2桁 | {value:F2} |
| 0埋め6桁 | {value:D6} |
| 通貨表示 | {value:C} |
| パーセント表示 | {value:P1} |
| 日付表示 | {date:yyyy/MM/dd} |
| 日時表示 | {date:yyyy-MM-dd HH:mm:ss} |
まずは、N0、F2、D6、yyyy/MM/dd の4つを覚えるだけでも、実務で使うC# Formatの多くに対応できます。

