C# ToStringの使い方完全ガイド|数値・日付の書式指定からoverrideまで初心者向けに解説

はじめに

C#でプログラムを書いていると、数値や日付、オブジェクトの値を画面に表示したり、ログに出力したりする場面がよくあります。そのときに頻繁に使うのがToStringメソッドです。

ToStringは、数値、日付、bool、enum、独自クラスなど、さまざまな値を文字列に変換するための基本的なメソッドです。特にC#では、すべての型がobject型を基にしているため、多くの場面でToStringを利用できます。

ただし、単に文字列に変換するだけでなく、数値をカンマ区切りにしたり、日付をyyyy/MM/dd形式にしたり、独自クラスの表示内容をカスタマイズしたりすることも可能です。

この記事では、C#のToStringの基本から、数値・日付の書式指定、CultureInfoによる表示の違い、overrideによる独自クラスの文字列表現まで、初心者にもわかりやすく解説します。

1. C#のToStringとは?まず知っておきたい基本

1-1. ToStringはオブジェクトを文字列に変換するメソッド

ToStringは、値やオブジェクトを文字列に変換するためのメソッドです。

たとえば、整数の100を文字列の"100"にしたい場合、次のように書けます。

C#
int number = 100;
string text = number.ToString();

Console.WriteLine(text);

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

C#
100

ここで重要なのは、100という数値と"100"という文字列は別物だということです。見た目は同じでも、数値は計算に使える値であり、文字列は表示や連結に使われるテキストです。

C#
int number = 100;
string text = number.ToString();

Console.WriteLine(number + 50); // 150
Console.WriteLine(text + 50); // 10050

number + 50は数値計算ですが、text + 50は文字列連結になります。このように、ToStringは「表示用の文字列を作る」ときに使うメソッドだと考えると理解しやすいです。

1-2. すべての型でToStringが使える理由

C#では、すべての型は最終的にSystem.Objectを基にしています。ObjectクラスにはToStringメソッドが定義されているため、多くの型でToStringを呼び出せます。

たとえば、次のように数値、日付、真偽値、文字列などでToStringを使えます。

C#
int number = 123;
double price = 99.5;
bool isActive = true;
DateTime today = DateTime.Now;

Console.WriteLine(number.ToString());
Console.WriteLine(price.ToString());
Console.WriteLine(isActive.ToString());
Console.WriteLine(today.ToString());

C#の標準型では、それぞれの型に合った文字列表現が返されます。

一方で、自分で作成したクラスの場合、ToStringをそのまま使うとクラス名のような文字列が表示されることがあります。その場合は、後述するoverrideを使って表示内容をカスタマイズできます。

1-3. ToStringの基本構文

ToStringの基本構文は次のとおりです。

C#
変数.ToString();

例を見てみましょう。

C#
int age = 25;
string ageText = age.ToString();

Console.WriteLine(ageText);

また、数値や日付では書式指定を渡すこともできます。

C#
int amount = 1000;
Console.WriteLine(amount.ToString("N0"));

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

C#
1,000

日付の場合は、次のように形式を指定できます。

C#
DateTime date = new DateTime(2026, 6, 13);
Console.WriteLine(date.ToString("yyyy/MM/dd"));

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

C#
2026/06/13

このように、ToString()は単純な文字列変換に使え、ToString("書式")は表示形式を整えるときに使います。

1-4. ToStringを使う主な場面

ToStringは、主に次のような場面で使われます。

画面に値を表示したいとき、ログに値を出力したいとき、ファイルやCSVに文字列として保存したいとき、APIや外部システムに文字列形式で値を渡したいときなどです。

たとえば、商品の価格を画面に表示する場合、数値のままではなく、ユーザーに見やすい文字列に変換することがあります。

C#
int price = 1200;
string displayPrice = price.ToString("N0") + "円";

Console.WriteLine(displayPrice);

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

C#
1,200

また、ログ出力では日時を一定の形式で文字列化しておくと、あとから確認しやすくなります。

C#
DateTime now = DateTime.Now;
Console.WriteLine(now.ToString("yyyy-MM-dd HH:mm:ss") + " 処理を開始しました");

このように、ToStringは「人が読みやすい形に変換する」ためによく使われます。

1-5. Console.WriteLineや文字列連結で自動的に呼ばれるケース

C#では、明示的にToStringを書かなくても、内部的にToStringが呼ばれることがあります。

たとえば、Console.WriteLineに数値を渡すと、画面には文字列として表示されます。

C#
int number = 123;
Console.WriteLine(number);

この場合、Console.WriteLineが値を表示する過程で文字列化を行います。

文字列連結でも同じです。

C#
int age = 25;
string message = "年齢は" + age + "歳です";

Console.WriteLine(message);

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

C#
年齢は25歳です

このような場面では、C#が自動的に文字列化してくれるため、必ずしもage.ToString()と書く必要はありません。

ただし、表示形式を指定したい場合は、明示的にToString("N0")ToString("yyyy/MM/dd")のように書く必要があります。

2. C# ToStringの基本的な使い方

2-1. 数値を文字列に変換する

数値を文字列に変換する基本的な例は次のとおりです。

C#
int number = 12345;
string text = number.ToString();

Console.WriteLine(text);

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

C#
12345

小数でも同じように使えます。

C#
double value = 12.345;
string text = value.ToString();

Console.WriteLine(text);

出力結果は環境によって小数点の記号などが変わることがありますが、日本語環境では一般的に次のようになります。

C#
12.345

数値をただ文字列に変換するだけならToString()で十分ですが、桁区切りや小数点以下の桁数を指定したい場合は、書式指定を使います。

C#
int price = 1234567;
Console.WriteLine(price.ToString("N0"));

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

C#
1,234,567

2-2. bool型を文字列に変換する

bool型にもToStringを使えます。

C#
bool isActive = true;
string text = isActive.ToString();

Console.WriteLine(text);

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

C#
True

falseの場合は次のようになります。

C#
bool isDeleted = false;
Console.WriteLine(isDeleted.ToString());

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

C#
False

注意点として、bool.ToString()の結果は"true""false"ではなく、先頭が大文字の"True""False"です。

小文字で出力したい場合は、次のようにToLowerを組み合わせます。

C#
bool isActive = true;
Console.WriteLine(isActive.ToString().ToLower());

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

C#
true

2-3. DateTimeを文字列に変換する

DateTime型もToStringで文字列に変換できます。

C#
DateTime date = new DateTime(2026, 6, 13);
string text = date.ToString();

Console.WriteLine(text);

出力結果は実行環境のカルチャ設定によって変わります。日本語環境では、日付と時刻を含む形式で表示されることがあります。

日付の形式を明確に指定したい場合は、次のように書きます。

C#
DateTime date = new DateTime(2026, 6, 13);
Console.WriteLine(date.ToString("yyyy/MM/dd"));

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

C#
2026/06/13

時刻も含めたい場合は、次のように指定します。

C#
DateTime now = new DateTime(2026, 6, 13, 15, 30, 45);
Console.WriteLine(now.ToString("yyyy/MM/dd HH:mm:ss"));

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

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

DateTime.ToStringでは、日付や時刻を自由に整形できるため、画面表示やログ出力でよく使われます。

2-4. enumを文字列に変換する

enumToStringで文字列に変換できます。

C#
enum OrderStatus
{
Pending,
Shipped,
Completed,
Canceled
}

OrderStatus status = OrderStatus.Shipped;
Console.WriteLine(status.ToString());

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

C#
Shipped

enum.ToString()は、列挙値の名前を文字列として返します。

数値として表示したい場合は、キャストを使います。

C#
OrderStatus status = OrderStatus.Shipped;
Console.WriteLine((int)status);

enumの名前をログや画面に表示したい場合はToStringが便利です。ただし、ユーザー向けに日本語表示したい場合は、ToStringの結果をそのまま出すのではなく、別途表示名を用意することが多いです。

2-5. nullに対してToStringを使うときの注意点

ToStringで特に注意したいのがnullです。

参照型の変数がnullの状態でToStringを呼び出すと、NullReferenceExceptionが発生します。

C#
string name = null;
Console.WriteLine(name.ToString());

このコードは実行時エラーになります。nullはオブジェクトが存在しない状態なので、メソッドを呼び出せません。

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

C#
string name = null;

string text = name?.ToString() ?? "";
Console.WriteLine(text);

また、Convert.ToStringを使う方法もあります。

C#
string name = null;
string text = Convert.ToString(name);

Console.WriteLine(text);

Convert.ToString(null)は空文字列を返すため、nullの可能性がある値を安全に文字列化したい場合に便利です。

3. 数値のToStringで書式指定する方法

3-1. ToString("N")でカンマ区切りの数値にする

数値をカンマ区切りで表示したい場合は、"N"を使います。

C#
int number = 1234567;
Console.WriteLine(number.ToString("N"));

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

C#
1,234,567.00

"N"は数値形式を表す標準書式指定子です。標準では小数点以下2桁が表示されます。

小数点以下を表示したくない場合は、"N0"と書きます。

C#
int number = 1234567;
Console.WriteLine(number.ToString("N0"));

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

C#
1,234,567

小数点以下1桁にしたい場合は"N1"、3桁にしたい場合は"N3"のように指定します。

C#
double value = 1234.5678;

Console.WriteLine(value.ToString("N1"));
Console.WriteLine(value.ToString("N3"));

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

C#
1,234.6
1,234.568

3-2. ToString("C")で通貨形式にする

通貨形式で表示したい場合は、"C"を使います。

C#
int price = 1200;
Console.WriteLine(price.ToString("C"));

日本語環境では、次のように表示されます。

C#
¥1,200

小数点以下を表示したくない場合は、"C0"を使います。

C#
decimal price = 1200m;
Console.WriteLine(price.ToString("C0"));

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

C#
¥1,200

通貨記号は実行環境のカルチャに依存します。日本語環境では円記号、英語の米国環境ではドル記号が使われます。

C#
using System.Globalization;

decimal price = 1200m;

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

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

C#
¥1,200
$1,200

3-3. ToString("P")でパーセント表示にする

割合をパーセント表示にしたい場合は、"P"を使います。

C#
double rate = 0.25;
Console.WriteLine(rate.ToString("P"));

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

C#
25.00%

小数点以下を表示しない場合は、"P0"を使います。

C#
double rate = 0.25;
Console.WriteLine(rate.ToString("P0"));

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

C#
25%

"P"は値に100を掛けた結果をパーセントとして表示します。そのため、25"P"で表示すると2,500%のようになります。

C#
double rate = 25;
Console.WriteLine(rate.ToString("P0"));

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

C#
2,500%

パーセント表示したい場合は、25%なら0.25のように小数で持つのが一般的です。

3-4. ToString("D")でゼロ埋めする

整数をゼロ埋めしたい場合は、"D"を使います。

C#
int number = 42;
Console.WriteLine(number.ToString("D5"));

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

C#
00042

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

C#
int id = 123;

Console.WriteLine(id.ToString("D3"));
Console.WriteLine(id.ToString("D6"));

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

C#
123
000123

IDや連番、ファイル名などで桁数をそろえたい場合に便利です。

C#
int fileNumber = 7;
string fileName = "image_" + fileNumber.ToString("D4") + ".png";

Console.WriteLine(fileName);

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

C#
image_0007.png

3-5. ToString("F")で小数点以下の桁数を指定する

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

C#
double value = 12.3456;
Console.WriteLine(value.ToString("F2"));

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

C#
12.35

"F2"は小数点以下2桁で表示するという意味です。指定した桁数より下は丸められます。

C#
double value = 12.3456;

Console.WriteLine(value.ToString("F0"));
Console.WriteLine(value.ToString("F1"));
Console.WriteLine(value.ToString("F3"));

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

C#
12
12.3
12.346

"N"との違いは、"N"が桁区切りを含むのに対し、"F"は基本的に桁区切りを含まない点です。

C#
double value = 1234.567;

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

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

C#
1,234.57
1234.57

3-6. ToString("X")で16進数に変換する

整数を16進数で表示したい場合は、"X"を使います。

C#
int number = 255;
Console.WriteLine(number.ToString("X"));

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

C#
FF

小文字で表示したい場合は、"x"を使います。

C#
int number = 255;
Console.WriteLine(number.ToString("x"));

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

C#
ff

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

C#
int number = 255;
Console.WriteLine(number.ToString("X4"));

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

C#
00FF

16進数表示は、色コード、バイナリデータ、メモリアドレス風の表示、デバッグなどで使われることがあります。

3-7. カスタム数値書式「0」「#」「.」「,」の使い方

標準書式指定子だけでなく、カスタム数値書式も使えます。

よく使う記号は次の4つです。

0は、該当する桁がない場合でも0を表示します。#は、該当する桁がない場合は表示しません。.は小数点の位置を表します。,は桁区切りやスケーリングに使います。

C#
int number = 123;
Console.WriteLine(number.ToString("00000"));

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

C#
00123

0を使うと、足りない桁が0で埋められます。

C#
int number = 123;
Console.WriteLine(number.ToString("#####"));

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

C#
123

#は必要な桁だけ表示します。

小数点以下の桁数を指定する例です。

C#
double value = 12.3;

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

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

C#
12.30
12.3

カンマ区切りを入れたい場合は、次のように書きます。

C#
int number = 1234567;
Console.WriteLine(number.ToString("#,0"));

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

C#
1,234,567

金額表示では、次のような書き方もよく使います。

C#
int price = 1000;
Console.WriteLine(price.ToString("#,0") + "円");

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

C#
1,000

4. DateTimeのToStringで日付・時刻を整形する方法

4-1. ToString("yyyy/MM/dd")で日付を指定形式にする

DateTimeを任意の日付形式で表示したい場合は、カスタム日付書式を使います。

C#
DateTime date = new DateTime(2026, 6, 13);
Console.WriteLine(date.ToString("yyyy/MM/dd"));

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

C#
2026/06/13

yyyyは4桁の年、MMは2桁の月、ddは2桁の日を表します。

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

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

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

C#
2026/06/03
2026/6/3

MMddのように2文字で指定すると、1桁の月や日がゼロ埋めされます。Mdのように1文字で指定すると、ゼロ埋めされません。

4-2. ToString("HH:mm:ss")で時刻を指定形式にする

時刻を表示したい場合は、HHmmssを使います。

C#
DateTime time = new DateTime(2026, 6, 13, 9, 5, 7);
Console.WriteLine(time.ToString("HH:mm:ss"));

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

C#
09:05:07

HHは24時間表記の時、mmは分、ssは秒を表します。

12時間表記にしたい場合は、hhを使います。

C#
DateTime time = new DateTime(2026, 6, 13, 21, 30, 0);

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

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

C#
21:30
09:30 午後

日本の業務システムやログでは、24時間表記のHH:mm:ssがよく使われます。

4-3. ToString("yyyy年MM月dd日")で日本語形式にする

日本語の表示にしたい場合は、書式文字列に日本語をそのまま含められます。

C#
DateTime date = new DateTime(2026, 6, 13);
Console.WriteLine(date.ToString("yyyy年MM月dd日"));

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

C#
2026年06月13日

時刻も含める場合は、次のように書けます。

C#
DateTime date = new DateTime(2026, 6, 13, 15, 30, 0);
Console.WriteLine(date.ToString("yyyy年MM月dd日 HH時mm分"));

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

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

請求書、帳票、画面表示など、ユーザーに見せる日付ではこのような形式がよく使われます。

4-4. 標準の日付書式指定子「d」「D」「f」「F」「g」「G」

DateTime.ToStringでは、標準の日付書式指定子も使えます。

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は長い日付形式、fは長い日付と短い時刻、Fは長い日付と長い時刻、gは短い日付と短い時刻、Gは短い日付と長い時刻です。

ただし、これらはカルチャに依存します。日本語環境と英語環境では出力が変わるため、固定形式が必要な場合は"yyyy-MM-dd"のようなカスタム書式を使うのがおすすめです。

4-5. 曜日を表示する「ddd」「dddd」の使い方

曜日を表示したい場合は、dddまたはddddを使います。

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

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

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

C#

土曜日

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

C#
DateTime date = new DateTime(2026, 6, 13);
Console.WriteLine(date.ToString("yyyy年MM月dd日(dddd)"));

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

C#
2026年06月13日(土曜日)

スケジュール画面や予約システムでは、曜日を含めるとユーザーが日付を確認しやすくなります。

4-6. 月・日・時刻の書式指定でよく使うパターン一覧

DateTime.ToStringでよく使うパターンを紹介します。

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

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

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

C#
2026/06/13
2026-06-13
20260613
09:05
09:05:07
2026/06/13 09:05:07
2026年06月13日
2026年06月13日 09時05分

ファイル名に使う場合は、/:などファイル名に使えない文字を避ける必要があります。

C#
DateTime now = DateTime.Now;
string fileName = "log_" + now.ToString("yyyyMMdd_HHmmss") + ".txt";

Console.WriteLine(fileName);

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

C#
log_20260613_090507.txt

5. ToStringとカルチャの関係

5-1. CultureInfoとは何か

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

C#では、日付、通貨、数値の桁区切り、小数点記号、曜日名、月名などがカルチャによって変わります。

CultureInfoを使うには、次の名前空間を追加します。

C#
using System.Globalization;

たとえば、日本のカルチャはja-JP、アメリカ英語のカルチャはen-USです。

C#
CultureInfo ja = new CultureInfo("ja-JP");
CultureInfo us = new CultureInfo("en-US");

ToStringCultureInfoを渡すことで、どの国や地域の形式で文字列化するかを指定できます。

5-2. 日本語・英語で日付や通貨表示が変わる理由

同じ値でも、カルチャが違うと表示結果が変わります。

C#
using System.Globalization;

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

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

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

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

C#
2026年6月13日
Saturday, June 13, 2026
¥1,200
$1,200.00

このように、日付の並び順、曜日名、通貨記号、小数点以下の表示などが変わります。

画面表示ではユーザーの地域に合わせるのが便利ですが、ログやCSV、APIのように機械的に処理するデータでは、カルチャ依存が問題になることがあります。

5-3. ToString(format, CultureInfo)の使い方

書式とカルチャを同時に指定する場合は、次のように書きます。

C#
.ToString("書式", CultureInfo);

数値の例です。

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#
using System.Globalization;

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

Console.WriteLine(date.ToString("dddd, MMMM dd, yyyy", new CultureInfo("en-US")));
Console.WriteLine(date.ToString("yyyy年MM月dd日 dddd", new CultureInfo("ja-JP")));

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

C#
Saturday, June 13, 2026
2026年06月13日 土曜日

多言語対応のアプリでは、CultureInfoを適切に指定することで、ユーザーに自然な表示を提供できます。

5-4. InvariantCultureを使うべき場面

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

C#
using System.Globalization;

double value = 1234.56;
Console.WriteLine(value.ToString(CultureInfo.InvariantCulture));

InvariantCultureは、ログ、CSV、設定ファイル、API通信、データ保存など、環境によって結果が変わってほしくない場面で使います。

たとえば、小数点の表記は国によって.だったり,だったりします。人間向けの表示なら問題ありませんが、システム間連携では形式が変わるとエラーの原因になります。

C#
using System.Globalization;

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

Console.WriteLine(text);

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

C#
1234.56

APIやファイルに保存する値は、ユーザーの環境に左右されない形式にするのが安全です。

5-5. ログ・CSV・API出力で注意すべきカルチャ依存

ログやCSV、API出力でToString()をそのまま使うと、実行環境によって結果が変わる可能性があります。

たとえば、次のコードは環境によって日付の表示が変わることがあります。

C#
DateTime now = DateTime.Now;
string text = now.ToString();

日本語環境では日本風の表示、英語環境では英語風の表示になる可能性があります。ログとして保存する場合、形式が統一されていないと検索や解析がしにくくなります。

ログでは次のように固定形式を指定するのがおすすめです。

C#
DateTime now = DateTime.Now;
string logTime = now.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);

Console.WriteLine(logTime);

CSVやAPIでは、日付をISO 8601形式に近い形で出力することもよくあります。

C#
DateTime now = DateTime.UtcNow;
string text = now.ToString("yyyy-MM-ddTHH:mm:ssZ", CultureInfo.InvariantCulture);

Console.WriteLine(text);

人間向けの画面表示ではカルチャに合わせ、システム向けの出力では固定形式にするのが基本です。

6. ToStringをoverrideして独自クラスの表示を変える方法

6-1. overrideとは何か

overrideとは、親クラスに定義されているメソッドを、子クラスや独自クラス側で再定義する仕組みです。

ToStringobjectクラスに定義されているメソッドなので、自分で作ったクラスでもoverrideできます。

C#
public override string ToString()
{
return "表示したい文字列";
}

ToStringoverrideすると、そのクラスのオブジェクトを文字列として表示したときの内容を自分で決められます。

6-2. ToStringをoverrideしない場合の出力結果

まず、ToStringoverrideしない例を見てみましょう。

C#
public class Product
{
public string Name { get; set; }
public int Price { get; set; }
}

Product product = new Product
{
Name = "ノートPC",
Price = 120000
};

Console.WriteLine(product.ToString());

出力結果は、次のようにクラス名になることがあります。

C#
Product

名前空間がある場合は、次のように表示されることもあります。

C#
SampleApp.Product

これでは、商品の名前や価格がわかりません。そこでToStringoverrideして、わかりやすい文字列を返すようにします。

6-3. クラスでToStringをoverrideする基本構文

独自クラスでToStringoverrideする基本構文は次のとおりです。

C#
public class クラス名
{
public override string ToString()
{
return "表示したい内容";
}
}

Productクラスで実装すると、次のようになります。

C#
public class Product
{
public string Name { get; set; }
public int Price { get; set; }

public override string ToString()
{
return $"{Name}:{Price}円";
}
}

使用例です。

C#
Product product = new Product
{
Name = "ノートPC",
Price = 120000
};

Console.WriteLine(product);

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

C#
ノートPC:120000円

Console.WriteLine(product)のように書いても、内部的にToStringが呼ばれます。

6-4. プロパティの値をわかりやすく表示する実装例

プロパティの値を見やすく表示するには、文字列補間と書式指定を組み合わせると便利です。

C#
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public int Price { get; set; }

public override string ToString()
{
return $"ID:{Id:D4}, 商品名:{Name}, 価格:{Price:N0}円";
}
}

使用例です。

C#
Product product = new Product
{
Id = 12,
Name = "キーボード",
Price = 8500
};

Console.WriteLine(product.ToString());

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

C#
ID:0012, 商品名:キーボード, 価格:8,500

Id:D4でIDを4桁のゼロ埋めにし、Price:N0で価格をカンマ区切りにしています。

このように、ToStringoverrideすると、オブジェクトの中身を人が読みやすい形で表示できます。

6-5. デバッグしやすいToStringの書き方

デバッグ目的でToStringを使う場合は、どのプロパティがどの値なのかがわかるように書くのがおすすめです。

C#
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public bool IsActive { get; set; }

public override string ToString()
{
return $"User(Id={Id}, Name={Name}, IsActive={IsActive})";
}
}

使用例です。

C#
User user = new User
{
Id = 1,
Name = "田中",
IsActive = true
};

Console.WriteLine(user);

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

C#
User(Id=1, Name=田中, IsActive=True)

デバッグ時には、単に田中と表示されるよりも、Name=田中のようにプロパティ名が含まれている方が理解しやすくなります。

一覧やログに出力する可能性があるクラスでは、ToStringをわかりやすく実装しておくと便利です。

6-6. overrideするときに避けたい実装例

ToStringoverrideするときは、重い処理や副作用のある処理を入れないようにしましょう。

避けたい例は次のような実装です。

C#
public override string ToString()
{
SaveToDatabase();
return Name;
}

ToStringは、ログ出力やデバッグ表示など、思わぬタイミングで呼ばれることがあります。そのため、データベース保存、ファイル書き込み、外部API呼び出しのような処理を入れるべきではありません。

また、例外が発生しやすい実装も避けるべきです。

C#
public override string ToString()
{
return Name.ToUpper();
}

Namenullの場合、NullReferenceExceptionが発生します。安全に書くなら次のようにします。

C#
public override string ToString()
{
return Name?.ToUpper() ?? "";
}

ToStringは、できるだけ軽く、安全で、わかりやすい文字列を返すように実装しましょう。

7. ToStringでよくあるエラーと注意点

7-1. NullReferenceExceptionが発生する原因

ToStringでよくあるエラーがNullReferenceExceptionです。

これは、nullの変数に対してToStringを呼び出したときに発生します。

C#
string name = null;
string text = name.ToString();

nameはオブジェクトを参照していないため、ToStringメソッドを呼び出せません。

安全に書くには、次のようにnullチェックをします。

C#
string name = null;

if (name != null)
{
Console.WriteLine(name.ToString());
}
else
{
Console.WriteLine("");
}

より簡潔に書くなら、null条件演算子を使います。

C#
string name = null;
string text = name?.ToString() ?? "";

Console.WriteLine(text);

参照型の値にToStringを使うときは、nullの可能性を意識しましょう。

7-2. null許容型でToStringを使うときの対処法

int?DateTime?のようなnull許容型でも注意が必要です。

C#
int? number = null;
Console.WriteLine(number.ToString());

この場合、Nullable<T>.ToString()は値がないときに空文字列を返します。

ただし、書式指定を使いたい場合は、そのままでは書けません。

C#
int? number = 123;
// Console.WriteLine(number.ToString("D5")); // これは書けない

null許容型で書式指定を使いたい場合は、HasValueValueを使います。

C#
int? number = 123;

string text = number.HasValue
? number.Value.ToString("D5")
: "";

Console.WriteLine(text);

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

C#
00123

また、null合体演算子を使って初期値を与える方法もあります。

C#
int? number = null;
string text = (number ?? 0).ToString("D5");

Console.WriteLine(text);

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

C#
00000

ただし、nullを0として扱ってよいかは仕様によります。未入力と0を区別する必要がある場合は、空文字や"未設定"などにする方が安全です。

7-3. 書式指定文字列を間違えたときの挙動

ToStringに渡す書式指定文字列を間違えると、期待と違う結果になったり、例外が発生したりすることがあります。

たとえば、数値に日付用の書式を指定しても、意図した結果にはなりません。

C#
int number = 123;
Console.WriteLine(number.ToString("yyyy/MM/dd"));

数値のカスタム書式として解釈されるため、日付にはなりません。

逆に、DateTimeに不適切な書式を指定すると、文字がそのまま表示されたり、書式として解釈されたりすることがあります。

C#
DateTime date = new DateTime(2026, 6, 13);
Console.WriteLine(date.ToString("price"));

日付書式では一部の文字が特別な意味を持つため、意図しない表示になる可能性があります。

固定の文字を含めたい場合は、シングルクォートで囲むと安全です。

C#
DateTime date = new DateTime(2026, 6, 13);
Console.WriteLine(date.ToString("yyyy/MM/dd 'created'"));

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

C#
2026/06/13 created

7-4. 小数点や丸めの表示で誤解しやすいポイント

ToStringで小数点以下の桁数を指定すると、表示上は丸められます。

C#
double value = 1.236;
Console.WriteLine(value.ToString("F2"));

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

C#
1.24

ここで注意したいのは、ToString("F2")は表示用の文字列を作っているだけで、元の数値そのものを変更しているわけではないという点です。

C#
double value = 1.236;
string text = value.ToString("F2");

Console.WriteLine(text);
Console.WriteLine(value);

text"1.24"ですが、valueは元の1.236のままです。

計算結果そのものを丸めたい場合は、Math.Roundなどを使います。

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

Console.WriteLine(rounded);

表示だけ整えたいのか、数値自体を丸めたいのかを区別することが大切です。

7-5. 文字列化と数値計算を混同しないための注意点

ToStringを使うと、値は文字列になります。文字列になった値は、そのままでは数値計算に使うべきではありません。

C#
int price = 1000;
string text = price.ToString();

Console.WriteLine(text + 500);

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

C#
1000500

これは数値の足し算ではなく、文字列連結です。

数値計算をしたい場合は、数値のまま計算してから最後にToStringで表示します。

C#
int price = 1000;
int total = price + 500;

Console.WriteLine(total.ToString("N0") + "円");

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

C#
1,500

基本的には、計算中は数値型のまま扱い、画面表示やログ出力の直前でToStringを使うとよいでしょう。

8. ToStringと似た処理との違い

8-1. ToStringとConvert.ToStringの違い

ToStringConvert.ToStringはどちらも文字列変換に使えますが、nullの扱いが異なります。

C#
string text = null;

// text.ToString(); // NullReferenceException
Console.WriteLine(Convert.ToString(text));

text.ToString()は、textnullだとエラーになります。一方、Convert.ToString(text)は空文字列を返します。

数値の場合は、どちらも文字列に変換できます。

C#
int number = 123;

Console.WriteLine(number.ToString());
Console.WriteLine(Convert.ToString(number));

出力結果はどちらも次のようになります。

C#
123
123

nullの可能性がない値ならToStringで問題ありません。nullの可能性がある値を安全に文字列化したい場合は、Convert.ToString?.ToString() ?? ""を検討するとよいでしょう。

8-2. ToStringと文字列補間の違い

文字列補間は、$"..."の中に変数や式を埋め込む書き方です。

C#
int age = 25;
string message = $"年齢は{age}歳です";

Console.WriteLine(message);

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

C#
年齢は25歳です

このとき、ageは内部的に文字列化されます。

書式指定もできます。

C#
int price = 1200;
string message = $"価格は{price:N0}円です";

Console.WriteLine(message);

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

C#
価格は1,200円です

単体の値を文字列化したいならToString、文章の中に値を埋め込みたいなら文字列補間が便利です。

C#
int price = 1200;

string text1 = price.ToString("N0");
string text2 = $"価格は{price:N0}円です";

8-3. ToStringとstring.Formatの違い

string.Formatは、書式付きの文字列を作るためのメソッドです。

C#
int price = 1200;
string message = string.Format("価格は{0:N0}円です", price);

Console.WriteLine(message);

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

C#
価格は1,200円です

文字列補間を使うと、同じ内容をより読みやすく書けます。

C#
int price = 1200;
string message = $"価格は{price:N0}円です";

現在のC#では、単純な文字列作成なら文字列補間がよく使われます。

ただし、テンプレート文字列を外部から読み込んで使う場合や、古いコードではstring.Formatが使われていることもあります。

8-4. ToStringとParse・TryParseの違い

ToStringは、値を文字列に変換する処理です。

C#
int number = 123;
string text = number.ToString();

一方、ParseTryParseは、文字列を数値や日付などの型に変換する処理です。

C#
string text = "123";
int number = int.Parse(text);

つまり、向きが逆です。

C#
int number = 123;
string text = number.ToString(); // 数値から文字列へ

int parsed = int.Parse(text); // 文字列から数値へ

Parseは変換に失敗すると例外が発生します。

C#
string text = "abc";
// int number = int.Parse(text); // 例外

安全に変換したい場合はTryParseを使います。

C#
string text = "abc";

if (int.TryParse(text, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("数値に変換できません");
}

ToStringは表示用、ParseTryParseは入力された文字列を値に戻すための処理だと覚えておきましょう。

8-5. どの方法を使うべきか判断する基準

どの方法を使うべきかは、目的によって変わります。

値を単純に文字列にしたい場合はToString()を使います。

C#
string text = number.ToString();

書式を指定して表示したい場合はToString("N0")ToString("yyyy/MM/dd")を使います。

C#
string priceText = price.ToString("N0");
string dateText = date.ToString("yyyy/MM/dd");

文章の中に値を埋め込みたい場合は、文字列補間が読みやすいです。

C#
string message = $"価格は{price:N0}円です";

nullの可能性がある値を安全に文字列化したい場合は、Convert.ToStringやnull条件演算子を使います。

C#
string text = Convert.ToString(value);
string safeText = value?.ToString() ?? "";

文字列を数値や日付に戻したい場合は、ParseまたはTryParseを使います。

C#
int.TryParse(text, out int number);

それぞれの役割を理解して使い分けることで、読みやすく安全なコードになります。

9. C# ToStringの実践サンプル

9-1. 金額を「1,000円」のように表示する

金額を日本語の画面に表示する場合、カンマ区切りにして末尾にを付けることがよくあります。

C#
int price = 1000;
string displayPrice = price.ToString("N0") + "円";

Console.WriteLine(displayPrice);

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

C#
1,000

文字列補間を使うと、さらに読みやすく書けます。

C#
int price = 1000;
string displayPrice = $"{price:N0}円";

Console.WriteLine(displayPrice);

出力結果は同じです。

C#
1,000

消費税を含めた金額を表示する例です。

C#
int price = 1000;
double taxRate = 0.10;
int total = (int)(price * (1 + taxRate));

Console.WriteLine($"税込価格:{total:N0}円");

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

C#
税込価格:1,100

9-2. 日付を「2026年06月13日」のように表示する

日付を日本語形式で表示する例です。

C#
DateTime date = new DateTime(2026, 6, 13);
string text = date.ToString("yyyy年MM月dd日");

Console.WriteLine(text);

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

C#
2026年06月13日

曜日も含めたい場合は、次のように書きます。

C#
DateTime date = new DateTime(2026, 6, 13);
string text = date.ToString("yyyy年MM月dd日(dddd)");

Console.WriteLine(text);

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

C#
2026年06月13日(土曜日)

ログ用には、次のような形式がよく使われます。

C#
DateTime now = DateTime.Now;
string logTime = now.ToString("yyyy-MM-dd HH:mm:ss");

Console.WriteLine(logTime);

日付の用途に応じて、ユーザー向けなら読みやすい日本語形式、ログ向けなら並び替えしやすい固定形式を使い分けましょう。

9-3. 商品クラスの情報をToStringで見やすく表示する

商品情報を持つクラスでToStringoverrideしてみましょう。

C#
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public int Price { get; set; }

public override string ToString()
{
return $"商品ID:{Id:D4}, 商品名:{Name}, 価格:{Price:N0}円";
}
}

使用例です。

C#
Product product = new Product
{
Id = 5,
Name = "マウス",
Price = 2980
};

Console.WriteLine(product);

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

C#
商品ID:0005, 商品名:マウス, 価格:2,980

ToStringを実装しておくと、Console.WriteLine(product)やログ出力でオブジェクトの内容がわかりやすくなります。

9-4. ログ出力でToStringを活用する

ログ出力では、日時や処理内容を一定の形式で出すことが重要です。

C#
DateTime now = DateTime.Now;
int userId = 123;
string action = "ログイン";

string log = $"{now:yyyy-MM-dd HH:mm:ss} UserId={userId:D6} Action={action}";

Console.WriteLine(log);

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

C#
2026-06-13 09:30:00 UserId=000123 Action=ログイン

文字列補間の中でも、{now:yyyy-MM-dd HH:mm:ss}{userId:D6}のように書式指定ができます。

これは次のようにToStringを使って書くこともできます。

C#
string log =
now.ToString("yyyy-MM-dd HH:mm:ss") +
" UserId=" + userId.ToString("D6") +
" Action=" + action;

どちらでも結果は同じですが、文章全体を作る場合は文字列補間の方が読みやすいことが多いです。

9-5. 一覧表示やデバッグで使える実用例

複数の商品を一覧表示する例です。

C#
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public int Price { get; set; }

public override string ToString()
{
return $"{Id:D3} | {Name} | {Price:N0}円";
}
}

一覧を表示します。

C#
List<Product> products = new List<Product>
{
new Product { Id = 1, Name = "ペン", Price = 120 },
new Product { Id = 2, Name = "ノート", Price = 250 },
new Product { Id = 3, Name = "バッグ", Price = 3980 }
};

foreach (Product product in products)
{
Console.WriteLine(product);
}

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

C#
001 | ペン | 120
002 | ノート | 250
003 | バッグ | 3,980

ToStringを整えておくと、一覧表示やデバッグ時にオブジェクトの内容をすぐ確認できます。

ただし、本格的な画面表示では、ToStringだけに頼らず、画面専用の表示処理やViewModelを用意することもあります。ToStringはあくまで簡易表示やデバッグ表示に向いていると考えるとよいでしょう。

10. C# ToStringに関するよくある質問

10-1. ToStringはいつ使うべき?

ToStringは、値を文字列として表示したいときに使います。

たとえば、数値を画面に表示する、日付を指定形式で表示する、ログに値を出力する、独自クラスの内容をわかりやすく表示する、といった場面です。

C#
int price = 1000;
Console.WriteLine(price.ToString("N0") + "円");

一方で、計算の途中でむやみにToStringを使う必要はありません。数値計算は数値型のまま行い、最後に表示するときに文字列へ変換するのが基本です。

10-2. ToStringで元の型に戻せる?

ToStringは、値を文字列に変換するメソッドです。文字列から元の型に戻すには、ParseTryParseを使います。

C#
int number = 123;
string text = number.ToString();

int result = int.Parse(text);

安全に変換したい場合は、TryParseを使います。

C#
string text = "123";

if (int.TryParse(text, out int result))
{
Console.WriteLine(result);
}

ただし、すべてのToString結果が完全に元の型へ戻せるとは限りません。たとえば、表示用にカンマや円記号を付けた文字列は、そのままでは数値に戻しにくい場合があります。

C#
int price = 1000;
string text = price.ToString("N0") + "円"; // 1,000円

表示用の文字列とデータ保存用の文字列は分けて考えることが大切です。

10-3. ToStringの結果は必ず同じになる?

ToStringの結果は、必ず同じになるとは限りません。

特に、日付、通貨、数値の小数点や桁区切りは、実行環境のカルチャによって変わることがあります。

C#
decimal price = 1200m;
Console.WriteLine(price.ToString("C"));

日本語環境では円表示になり、英語環境ではドル表示になる可能性があります。

結果を固定したい場合は、書式指定とCultureInfoを明示します。

C#
using System.Globalization;

decimal price = 1200m;
string text = price.ToString("C", new CultureInfo("ja-JP"));

ログ、CSV、APIなど、環境によって結果が変わってほしくない場合は、CultureInfo.InvariantCultureの利用も検討しましょう。

10-4. ToStringをoverrideすると何が便利?

ToStringoverrideすると、独自クラスのオブジェクトをわかりやすい文字列で表示できます。

overrideしない場合、クラス名だけが表示されることがあります。

C#
SampleApp.Product

しかし、ToStringを実装しておけば、次のように中身がわかる表示にできます。

C#
商品ID:0001, 商品名:ペン, 価格:120

ログ出力、デバッグ、簡易的な一覧表示で特に便利です。

ただし、ToStringには重い処理や副作用のある処理を入れず、オブジェクトの状態をわかりやすく返す程度にしておくのが安全です。

10-5. 初心者がまず覚えるべき書式指定はどれ?

初心者がまず覚えるべき書式指定は、数値ではN0F2D4、日付ではyyyy/MM/ddyyyy-MM-dd HH:mm:ssです。

金額や数量の表示ではN0がよく使われます。

C#
int price = 1234567;
Console.WriteLine(price.ToString("N0"));

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

C#
1,234,567

小数点以下の桁数を指定するならF2です。

C#
double value = 12.345;
Console.WriteLine(value.ToString("F2"));

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

C#
12.35

ゼロ埋めにはD4などを使います。

C#
int id = 7;
Console.WriteLine(id.ToString("D4"));

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

C#
0007

日付では、まず次の2つを覚えると実務でも役立ちます。

C#
DateTime now = DateTime.Now;

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

画面表示、ログ出力、ファイル名作成などで頻繁に使うため、最初に覚えておくと便利です。

まとめ

C#のToStringは、数値、日付、bool、enum、独自クラスなどを文字列に変換するための基本的なメソッドです。単純に文字列化するだけでなく、書式指定を使うことで、カンマ区切り、通貨形式、パーセント表示、ゼロ埋め、小数点以下の桁数指定、16進数表示など、さまざまな形に整えられます。

数値ではToString("N0")でカンマ区切り、ToString("C")で通貨形式、ToString("P")でパーセント表示、ToString("D4")でゼロ埋め、ToString("F2")で小数点以下の桁数指定ができます。

日付では、ToString("yyyy/MM/dd")ToString("yyyy年MM月dd日")ToString("HH:mm:ss")のように指定することで、用途に合った形式で表示できます。

また、ToStringの結果はカルチャによって変わることがあります。ユーザー向けの表示ではカルチャに合わせると自然ですが、ログ、CSV、API出力ではCultureInfo.InvariantCultureや固定の書式を使い、環境による違いを避けることが重要です。

独自クラスでは、ToStringoverrideすることで、オブジェクトの内容をわかりやすく表示できます。デバッグやログ出力で役立ちますが、重い処理や副作用のある処理は入れないようにしましょう。

ToStringは初心者が最初に覚えるべき重要なメソッドのひとつです。値を表示する直前で適切に文字列化し、用途に応じて書式指定やカルチャを使い分けることで、読みやすく安全なC#コードを書けるようになります。