C#のゼロ埋め完全ガイド|ToString・PadLeft・文字列補間で桁数指定する方法
はじめに
C#で数値や文字列の桁数をそろえたいときによく使うのが「ゼロ埋め」です。たとえば、連番を 1 ではなく 0001 と表示したり、ファイル名を file_001.txt のように並び順が崩れない形にしたりする場面で使います。
C#でゼロ埋めする代表的な方法は、ToString、PadLeft、文字列補間の3つです。
C#int num = 7;
Console.WriteLine(num.ToString("D4")); // 0007
Console.WriteLine("7".PadLeft(4, '0')); // 0007
Console.WriteLine($"{num:D4}"); // 0007
どれも同じように見えますが、数値を扱うのか、文字列を扱うのか、表示だけなのか、データとして保存するのかによって適した方法が変わります。
この記事では、C#でゼロ埋めする方法を、基本構文から実務で使いやすい書き方まで整理して解説します。
1. C#でゼロ埋めする方法の全体像
1-1. ゼロ埋めとは?桁数をそろえる目的
ゼロ埋めとは、指定した桁数に満たない値の左側に 0 を追加して、見た目の桁数をそろえる処理です。
たとえば、数値 5 を4桁で表示したい場合は、次のようにします。
C#0005
数値そのものは 5 のままですが、表示上は 0005 のように4桁になります。
ゼロ埋めは、主に次のような目的で使われます。
C#1 → 0001
12 → 0012
123 → 0123
1234 → 1234
桁数をそろえることで、一覧表示が見やすくなったり、文字列として並べ替えたときに順番が崩れにくくなったりします。
1-2. C#でゼロ埋めが必要になるよくある場面
C#でゼロ埋めが必要になる場面は、実務でも多くあります。
たとえば、連番IDを表示するときです。
C#int id = 23;
string displayId = id.ToString("D5");
Console.WriteLine(displayId); // 00023
また、ファイル名に連番を付けるときにも使います。
C#int index = 3;
string fileName = $"image_{index:D3}.png";
Console.WriteLine(fileName); // image_003.png
商品コードや会員番号、伝票番号など、固定桁のコードを扱う場合にもゼロ埋めはよく使われます。
C#int memberNo = 45;
string memberCode = $"M{memberNo:D6}";
Console.WriteLine(memberCode); // M000045
日付や時刻を文字列として整形する場合にも、月や日、時、分を2桁で表示するためにゼロ埋めが使われます。
C#DateTime date = new DateTime(2026, 4, 5, 9, 7, 0);
Console.WriteLine(date.ToString("yyyy/MM/dd HH:mm")); // 2026/04/05 09:07
1-3. 数値をゼロ埋めする方法と文字列をゼロ埋めする方法の違い
C#のゼロ埋めでは、「元の値が数値なのか文字列なのか」を意識することが大切です。
数値をゼロ埋めする場合は、ToString("D4") や $"{num:D4}" を使うのが基本です。
C#int num = 8;
string result = num.ToString("D4");
Console.WriteLine(result); // 0008
一方、すでに文字列として持っている値をゼロ埋めする場合は、PadLeft を使います。
C#string code = "8";
string result = code.PadLeft(4, '0');
Console.WriteLine(result); // 0008
たとえば、会員番号を文字列として受け取っている場合に、無理に数値へ変換すると先頭の0が消えることがあります。
C#string code = "0012";
int num = int.Parse(code);
Console.WriteLine(num); // 12
先頭の0を意味のある情報として扱う場合は、数値ではなく文字列として扱う方が安全です。
1-4. まず結論:ToString・PadLeft・文字列補間の使い分け
C#でゼロ埋めする方法は、次のように使い分けると分かりやすいです。
数値を指定桁数で表示したい場合は、ToString("D4") を使います。
C#int num = 5;
string result = num.ToString("D4");
Console.WriteLine(result); // 0005
文字列を指定桁数にそろえたい場合は、PadLeft(桁数, '0') を使います。
C#string value = "5";
string result = value.PadLeft(4, '0');
Console.WriteLine(result); // 0005
文字列の中に値を埋め込みながらゼロ埋めしたい場合は、文字列補間を使います。
C#int num = 5;
string message = $"番号は{num:D4}です。";
Console.WriteLine(message); // 番号は0005です。
実務では、数値の表示には ToString または文字列補間、文字列の桁合わせには PadLeft と覚えておくとよいでしょう。
2. ToStringで数値をゼロ埋めする方法
2-1. ToString("D4")で整数を4桁にゼロ埋めする
整数をゼロ埋めするもっとも基本的な方法は、ToString("D4") です。
C#int num = 7;
string result = num.ToString("D4");
Console.WriteLine(result); // 0007
D4 の D は10進整数を表す標準数値書式指定子です。4 は最小桁数を表します。
つまり、ToString("D4") は「整数を最低4桁で表示し、足りない桁は左側に0を追加する」という意味になります。
C#Console.WriteLine(1.ToString("D4")); // 0001
Console.WriteLine(12.ToString("D4")); // 0012
Console.WriteLine(123.ToString("D4")); // 0123
2-2. D書式指定子で桁数を指定する基本構文
D 書式指定子の基本構文は次のとおりです。
C#数値.ToString("D桁数")
たとえば、3桁で表示したい場合は D3、6桁で表示したい場合は D6 を指定します。
C#int num = 42;
Console.WriteLine(num.ToString("D3")); // 042
Console.WriteLine(num.ToString("D6")); // 000042
桁数は固定値で書くこともできますが、変数で指定したい場合はカスタム書式や文字列補間を使う方法もあります。
C#int num = 42;
int digits = 5;
string format = "D" + digits;
string result = num.ToString(format);
Console.WriteLine(result); // 00042
2-3. int・longなど整数型でのゼロ埋め例
D 書式指定子は、int や long などの整数型で使えます。
C#int intValue = 123;
long longValue = 987654321;
Console.WriteLine(intValue.ToString("D6")); // 000123
Console.WriteLine(longValue.ToString("D12")); // 000987654321
short や byte でも同じように使えます。
C#short shortValue = 9;
byte byteValue = 5;
Console.WriteLine(shortValue.ToString("D3")); // 009
Console.WriteLine(byteValue.ToString("D3")); // 005
整数のゼロ埋めであれば、基本的には ToString("D桁数") を使うのがシンプルです。
2-4. 指定桁数より大きい数値を指定した場合の挙動
指定した桁数よりも元の数値の桁数が大きい場合、数値が切り捨てられることはありません。
C#int num = 12345;
Console.WriteLine(num.ToString("D4")); // 12345
D4 は「必ず4桁にする」という意味ではなく、「最低4桁で表示する」という意味です。
そのため、元の数値が5桁であれば、そのまま5桁で表示されます。
C#Console.WriteLine(1.ToString("D4")); // 0001
Console.WriteLine(1234.ToString("D4")); // 1234
Console.WriteLine(12345.ToString("D4")); // 12345
固定桁を超えた値をエラーにしたい場合は、別途チェックを入れる必要があります。
C#int num = 12345;
int maxDigits = 4;
if (num.ToString().Length > maxDigits)
{
throw new ArgumentException("指定桁数を超えています。");
}
string result = num.ToString("D4");
2-5. 負の数をToStringでゼロ埋めした場合の表示
負の数に ToString("D4") を使った場合、マイナス記号の後ろに0が追加されます。
C#int num = -12;
Console.WriteLine(num.ToString("D4")); // -0012
この場合、数字部分が4桁になるようにゼロ埋めされます。マイナス記号は桁数には含まれません。
C#Console.WriteLine((-1).ToString("D4")); // -0001
Console.WriteLine((-99).ToString("D4")); // -0099
Console.WriteLine((-9999).ToString("D4")); // -9999
伝票番号や会員番号のように、負の数があり得ない値でゼロ埋めを行う場合は、事前に負数チェックを入れると安全です。
C#int id = -1;
if (id < 0)
{
throw new ArgumentOutOfRangeException(nameof(id), "IDに負の値は指定できません。");
}
string result = id.ToString("D4");
2-6. ToString("0000")との違いと使い分け
C#では、ToString("D4") だけでなく、ToString("0000") のようなカスタム数値書式でもゼロ埋めできます。
C#int num = 7;
Console.WriteLine(num.ToString("D4")); // 0007
Console.WriteLine(num.ToString("0000")); // 0007
整数を単純にゼロ埋めするだけなら、どちらも同じ結果になります。
ただし、意味としては少し違います。D4 は整数用の標準書式で、「10進整数を最低4桁で表示する」という指定です。
一方、0000 はカスタム数値書式で、「各桁を0で埋めて表示する」という指定です。
C#int num = 12345;
Console.WriteLine(num.ToString("D4")); // 12345
Console.WriteLine(num.ToString("0000")); // 12345
整数のゼロ埋めだけなら D4 の方が意図が伝わりやすいです。
一方、小数や複雑な表示形式を扱う場合は、カスタム書式を使うことがあります。
C#double price = 12.3;
Console.WriteLine(price.ToString("000.00")); // 012.30
整数のゼロ埋めには D桁数、小数を含む細かい表示調整にはカスタム書式、と使い分けるとよいでしょう。
3. PadLeftで文字列をゼロ埋めする方法
3-1. PadLeft(桁数, '0')の基本構文
PadLeft は、文字列の左側に指定した文字を追加して、指定した長さにそろえるメソッドです。
ゼロ埋めする場合は、次のように書きます。
C#string value = "7";
string result = value.PadLeft(4, '0');
Console.WriteLine(result); // 0007
基本構文は次のとおりです。
C#文字列.PadLeft(全体の長さ, 埋める文字)
ゼロ埋めでは、埋める文字に文字リテラルの '0' を指定します。
C#string result = "25".PadLeft(5, '0');
Console.WriteLine(result); // 00025
"0" ではなく '0' を使う点に注意しましょう。PadLeft の第2引数は char 型です。
3-2. 文字列の左側に0を追加して桁数をそろえる
PadLeft は文字列に対して使うため、会員番号や商品コードのように文字列として扱いたい値に向いています。
C#string code = "123";
string paddedCode = code.PadLeft(6, '0');
Console.WriteLine(paddedCode); // 000123
先頭に0を含むコードを扱う場合、数値型に変換しない方が安全です。
C#string inputCode = "00123";
Console.WriteLine(inputCode.PadLeft(6, '0')); // 000123
文字列として扱えば、先頭の0を保持したまま処理できます。
3-3. 数値を文字列に変換してPadLeftする方法
数値に対して PadLeft を使いたい場合は、先に ToString() で文字列に変換します。
C#int num = 7;
string result = num.ToString().PadLeft(4, '0');
Console.WriteLine(result); // 0007
ただし、数値をゼロ埋めするだけなら、通常は ToString("D4") の方が分かりやすいです。
C#int num = 7;
Console.WriteLine(num.ToString("D4")); // 0007
PadLeft は、数値よりも文字列の桁合わせに使う方が自然です。
たとえば、英数字を含むコードをゼロ埋めする場合です。
C#string code = "A12";
string result = code.PadLeft(6, '0');
Console.WriteLine(result); // 000A12
3-4. すでに指定桁数以上ある場合の挙動
PadLeft で指定した長さよりも、元の文字列がすでに長い場合、文字列はそのまま返されます。
C#string value = "12345";
string result = value.PadLeft(4, '0');
Console.WriteLine(result); // 12345
PadLeft(4, '0') は「最大4桁にする」処理ではなく、「最低4文字になるように左側を埋める」処理です。
そのため、長すぎる文字列を切り詰めたい場合は、別途処理が必要です。
C#string value = "12345";
int length = 4;
if (value.Length > length)
{
throw new ArgumentException("指定した桁数を超えています。");
}
string result = value.PadLeft(length, '0');
ゼロ埋めと桁数制限は別の処理として考えると、予期しない不具合を防ぎやすくなります。
3-5. PadLeftが向いているケース
PadLeft が向いているのは、元の値が文字列であり、左側を0で埋めたい場合です。
たとえば、外部システムから文字列として受け取ったコードを固定桁にそろえるケースです。
C#string customerCode = "58";
string fixedCode = customerCode.PadLeft(8, '0');
Console.WriteLine(fixedCode); // 00000058
英字を含むコードにも使えます。
C#string productCode = "A123";
string result = productCode.PadLeft(8, '0');
Console.WriteLine(result); // 0000A123
また、すでに文字列として意味を持つ値、たとえば郵便番号、会員番号、社員番号などにも PadLeft は向いています。
C#string employeeNo = "1234";
string displayNo = employeeNo.PadLeft(6, '0');
Console.WriteLine(displayNo); // 001234
3-6. PadLeftで注意すべき型変換とnull対策
PadLeft は文字列のメソッドなので、対象が null の場合は NullReferenceException が発生します。
C#string value = null;
// value.PadLeft(4, '0'); // NullReferenceException
null の可能性がある場合は、事前にチェックしましょう。
C#string value = null;
string result = (value ?? "").PadLeft(4, '0');
Console.WriteLine(result); // 0000
ただし、空文字をゼロ埋めしてよいかどうかは仕様によります。入力値が必須であれば、例外にした方がよい場合もあります。
C#string value = null;
if (string.IsNullOrEmpty(value))
{
throw new ArgumentException("値が指定されていません。");
}
string result = value.PadLeft(4, '0');
また、数値に変換してから PadLeft すると、先頭の0が消える点にも注意が必要です。
C#string code = "0012";
int num = int.Parse(code);
string result = num.ToString().PadLeft(4, '0');
Console.WriteLine(result); // 0012
この例では同じ結果に見えますが、元の値が 000012 のように意味を持つ場合、数値変換の時点で情報が失われます。
C#string code = "000012";
int num = int.Parse(code);
Console.WriteLine(num); // 12
先頭の0に意味がある値は、最初から最後まで文字列として扱うのが基本です。
4. 文字列補間でゼロ埋めする方法
4-1. $"{num:D4}"でゼロ埋めする基本構文
C#の文字列補間を使うと、文字列の中に値を埋め込みながらゼロ埋めできます。
C#int num = 7;
string result = $"{num:D4}";
Console.WriteLine(result); // 0007
基本構文は次のとおりです。
C#$"{値:書式}"
ゼロ埋めの場合は、書式に D4 のような数値書式を指定します。
C#int id = 15;
Console.WriteLine($"ID:{id:D5}"); // ID:00015
文字列の中でそのまま整形できるため、メッセージやファイル名を作るときに便利です。
4-2. 文字列補間とToStringの関係
文字列補間の書式指定は、内部的には ToString の書式指定と同じ考え方で使えます。
C#int num = 7;
string a = num.ToString("D4");
string b = $"{num:D4}";
Console.WriteLine(a); // 0007
Console.WriteLine(b); // 0007
単独の値をゼロ埋めするだけなら ToString("D4") でも十分です。
C#int num = 7;
string result = num.ToString("D4");
一方、文章やファイル名の中に値を埋め込む場合は、文字列補間の方が読みやすくなります。
C#int num = 7;
string fileName = $"report_{num:D4}.csv";
Console.WriteLine(fileName); // report_0007.csv
4-3. 複数の値を埋め込みながらゼロ埋めする例
文字列補間では、複数の値を同時に埋め込みながら、それぞれに書式を指定できます。
C#int year = 2026;
int month = 4;
int day = 5;
int seq = 12;
string code = $"{year}{month:D2}{day:D2}-{seq:D4}";
Console.WriteLine(code); // 20260405-0012
ファイル名を作る場合にも便利です。
C#int userId = 25;
int fileNo = 3;
string fileName = $"user_{userId:D5}_file_{fileNo:D3}.txt";
Console.WriteLine(fileName); // user_00025_file_003.txt
ログメッセージのように、複数の値を読みやすく埋め込みたい場合にも向いています。
C#int orderId = 123;
int lineNo = 4;
string message = $"注文番号:{orderId:D8}, 行番号:{lineNo:D3}";
Console.WriteLine(message); // 注文番号:00000123, 行番号:004
4-4. 可読性を重視する場合の書き方
可読性を重視するなら、文字列の組み立てには + で連結するよりも文字列補間を使うのがおすすめです。
C#int id = 42;
// 読みにくい例
string a = "ID=" + id.ToString("D5") + " が登録されました。";
// 読みやすい例
string b = $"ID={id:D5} が登録されました。";
Console.WriteLine(b); // ID=00042 が登録されました。
文字列補間を使うと、完成形に近い形でコードを書けます。
特に、ファイル名、ログ、メッセージ、画面表示用テキストでは、文字列補間の方が保守しやすいです。
C#int invoiceNo = 123;
DateTime issuedAt = new DateTime(2026, 4, 5);
string text = $"請求書番号:{invoiceNo:D6} 発行日:{issuedAt:yyyy/MM/dd}";
Console.WriteLine(text); // 請求書番号:000123 発行日:2026/04/05
4-5. string.Formatとの違い
string.Format でもゼロ埋めは可能です。
C#int num = 7;
string result = string.Format("{0:D4}", num);
Console.WriteLine(result); // 0007
文字列補間で書くと、次のようになります。
C#int num = 7;
string result = $"{num:D4}";
Console.WriteLine(result); // 0007
string.Format は、プレースホルダーの番号と引数の位置を対応させる必要があります。
C#int id = 12;
string name = "Tanaka";
string text = string.Format("ID:{0:D4}, Name:{1}", id, name);
Console.WriteLine(text); // ID:0012, Name:Tanaka
文字列補間なら、変数名をそのまま書けるため読みやすくなります。
C#int id = 12;
string name = "Tanaka";
string text = $"ID:{id:D4}, Name:{name}";
Console.WriteLine(text); // ID:0012, Name:Tanaka
新しく書くコードでは、特別な理由がなければ文字列補間を使う方が自然です。
5. 小数・日付・IDなどケース別のゼロ埋め実例
5-1. 連番IDを0001・0002のように表示する
連番IDを4桁で表示したい場合は、ToString("D4") を使います。
C#for (int i = 1; i <= 5; i++)
{
Console.WriteLine(i.ToString("D4"));
}
実行結果は次のようになります。
C#0001
0002
0003
0004
0005
文字列補間を使う場合は、次のように書けます。
C#for (int i = 1; i <= 5; i++)
{
Console.WriteLine($"ID-{i:D4}");
}
実行結果です。
C#ID-0001
ID-0002
ID-0003
ID-0004
ID-0005
5-2. ファイル名に001・002のような連番を付ける
ファイル名に連番を付ける場合は、文字列補間が便利です。
C#for (int i = 1; i <= 3; i++)
{
string fileName = $"image_{i:D3}.png";
Console.WriteLine(fileName);
}
実行結果です。
C#image_001.png
image_002.png
image_003.png
ファイル名にゼロ埋めを使うと、文字列として並べ替えたときに順番が崩れにくくなります。
C#file_001.txt
file_002.txt
file_010.txt
file_100.txt
ゼロ埋めしない場合、環境によっては file_10.txt が file_2.txt より前に並ぶことがあります。連番ファイルでは、桁数をそろえておくと管理しやすくなります。
5-3. 小数点以下の桁数をそろえる
小数点以下の桁数をそろえる場合は、D 書式指定子ではなく、カスタム数値書式や固定小数点書式を使います。
C#double value = 12.3;
Console.WriteLine(value.ToString("F2")); // 12.30
F2 は、小数点以下を2桁で表示する書式です。
C#Console.WriteLine(1.2.ToString("F2")); // 1.20
Console.WriteLine(12.345.ToString("F2")); // 12.35
整数部分も含めてゼロ埋めしたい場合は、カスタム書式を使います。
C#double value = 12.3;
Console.WriteLine(value.ToString("000.00")); // 012.30
文字列補間でも同じように書けます。
C#double value = 7.5;
Console.WriteLine($"{value:000.00}"); // 007.50
5-4. 日付や時刻をゼロ埋めして表示する
日付や時刻では、月や日、時、分を2桁で表示することがよくあります。
C#DateTime date = new DateTime(2026, 4, 5, 9, 7, 0);
Console.WriteLine(date.ToString("yyyy/MM/dd HH:mm")); // 2026/04/05 09:07
日付書式では、MM や dd、HH、mm のように2文字で指定すると、必要に応じてゼロ埋めされます。
C#DateTime date = new DateTime(2026, 1, 2, 3, 4, 5);
Console.WriteLine(date.ToString("yyyyMMdd")); // 20260102
Console.WriteLine(date.ToString("HHmmss")); // 030405
Console.WriteLine(date.ToString("yyyy-MM-dd")); // 2026-01-02
ファイル名に日付と連番を入れる場合は、次のように書けます。
C#DateTime now = new DateTime(2026, 4, 5, 9, 7, 0);
int seq = 3;
string fileName = $"log_{now:yyyyMMdd_HHmmss}_{seq:D3}.txt";
Console.WriteLine(fileName); // log_20260405_090700_003.txt
5-5. 商品コード・会員番号・伝票番号をゼロ埋めする
商品コードや会員番号、伝票番号のような固定桁の番号では、ゼロ埋めがよく使われます。
数値として管理している場合は、ToString("D桁数") を使います。
C#int productNo = 123;
string productCode = $"P{productNo:D6}";
Console.WriteLine(productCode); // P000123
会員番号を8桁で表示する例です。
C#int memberNo = 4567;
string memberCode = memberNo.ToString("D8");
Console.WriteLine(memberCode); // 00004567
すでに文字列としてコードを持っている場合は、PadLeft を使います。
C#string slipNo = "987";
string displaySlipNo = slipNo.PadLeft(10, '0');
Console.WriteLine(displaySlipNo); // 0000000987
英字を含む商品コードの場合も PadLeft が使えます。
C#string productCode = "A45";
string result = productCode.PadLeft(6, '0');
Console.WriteLine(result); // 000A45
5-6. 桁数を変数で指定してゼロ埋めする
桁数を固定値ではなく変数で指定したい場合は、書式文字列を組み立てます。
C#int num = 42;
int digits = 5;
string result = num.ToString("D" + digits);
Console.WriteLine(result); // 00042
文字列補間を使って書式を組み立てることもできます。
C#int num = 42;
int digits = 5;
string format = $"D{digits}";
string result = num.ToString(format);
Console.WriteLine(result); // 00042
PadLeft では、桁数をそのまま変数で渡せます。
C#string value = "42";
int digits = 5;
string result = value.PadLeft(digits, '0');
Console.WriteLine(result); // 00042
文字列補間の中で動的な桁数を扱う場合は、少し書き方に注意が必要です。シンプルにするなら、先に書式文字列を作る方法が分かりやすいです。
C#int num = 42;
int digits = 5;
string format = "D" + digits;
string result = $"{num.ToString(format)}";
Console.WriteLine(result); // 00042
可読性を重視するなら、共通メソッドに切り出すのもおすすめです。
C#static string ZeroPad(int value, int digits)
{
return value.ToString("D" + digits);
}
Console.WriteLine(ZeroPad(42, 5)); // 00042
6. ToString・PadLeft・文字列補間の使い分け
6-1. 数値のゼロ埋めにはToStringまたは文字列補間を使う
元の値が int や long などの数値であれば、ToString("D4") または文字列補間を使うのが基本です。
C#int num = 7;
string a = num.ToString("D4");
string b = $"{num:D4}";
Console.WriteLine(a); // 0007
Console.WriteLine(b); // 0007
単独でゼロ埋めした文字列を作るだけなら、ToString("D4") がシンプルです。
C#string id = num.ToString("D4");
文章やファイル名の中に埋め込むなら、文字列補間が読みやすくなります。
C#string fileName = $"data_{num:D4}.csv";
6-2. 文字列のゼロ埋めにはPadLeftを使う
元の値が文字列の場合は、PadLeft を使います。
C#string code = "123";
string result = code.PadLeft(6, '0');
Console.WriteLine(result); // 000123
特に、先頭の0に意味がある値は、数値に変換せず文字列として扱うことが重要です。
C#string memberCode = "000123";
Console.WriteLine(memberCode); // 000123
会員番号、社員番号、郵便番号、商品コードなどは、計算に使う数値ではなく識別子として扱うことが多いため、文字列として管理する方が安全です。
6-3. 可読性を重視するなら文字列補間を使う
可読性を重視する場合は、文字列補間が便利です。
C#int orderNo = 123;
int lineNo = 4;
string text = $"注文番号:{orderNo:D8}, 明細番号:{lineNo:D3}";
Console.WriteLine(text); // 注文番号:00000123, 明細番号:004
+ で文字列を連結すると、値が増えるほど読みにくくなります。
C#string text = "注文番号:" + orderNo.ToString("D8") + ", 明細番号:" + lineNo.ToString("D3");
文字列補間なら、最終的な文字列の形をイメージしやすく、修正もしやすくなります。
6-4. 動的な桁数指定をしたい場合の選び方
桁数を変数で指定したい場合、数値なら ToString("D" + digits) が分かりやすいです。
C#int value = 123;
int digits = 6;
string result = value.ToString("D" + digits);
Console.WriteLine(result); // 000123
文字列なら PadLeft(digits, '0') を使います。
C#string value = "123";
int digits = 6;
string result = value.PadLeft(digits, '0');
Console.WriteLine(result); // 000123
複雑な文字列を組み立てる場合は、ゼロ埋めした値を先に作ってから文字列補間で埋め込むと読みやすくなります。
C#int orderNo = 123;
int digits = 8;
string formattedOrderNo = orderNo.ToString("D" + digits);
string message = $"注文番号:{formattedOrderNo}";
Console.WriteLine(message); // 注文番号:00000123
6-5. パフォーマンスや保守性を考えた使い分け
ゼロ埋めの処理自体は軽量なため、通常の業務アプリケーションでは、パフォーマンスよりも可読性や保守性を優先することが多いです。
大量の文字列をループで組み立てる場合は、不要な変換や連結を避けることが大切です。
C#var lines = new List<string>();
for (int i = 1; i <= 1000; i++)
{
lines.Add($"ID:{i:D6}");
}
桁数や接頭辞が複数箇所に散らばると、後から変更しにくくなります。実務では、桁数を定数化しておくと保守しやすくなります。
C#const int IdDigits = 6;
int id = 123;
string displayId = id.ToString("D" + IdDigits);
Console.WriteLine(displayId); // 000123
同じゼロ埋め処理を何度も使う場合は、共通メソッド化するのも有効です。
C#static string FormatId(int id)
{
const int IdDigits = 6;
return id.ToString("D" + IdDigits);
}
6-6. 目的別おすすめ早見表
数値をゼロ埋めして表示するなら、ToString("D4") が基本です。
C#int num = 7;
string result = num.ToString("D4"); // 0007
文字列をゼロ埋めするなら、PadLeft を使います。
C#string code = "7";
string result = code.PadLeft(4, '0'); // 0007
文章やファイル名に埋め込むなら、文字列補間が便利です。
C#int num = 7;
string fileName = $"file_{num:D4}.txt"; // file_0007.txt
小数点以下をそろえるなら、F2 やカスタム書式を使います。
C#double value = 1.2;
string result = value.ToString("F2"); // 1.20
日付や時刻をゼロ埋めするなら、日付書式を使います。
C#DateTime date = new DateTime(2026, 4, 5);
string result = date.ToString("yyyy/MM/dd"); // 2026/04/05
7. C#のゼロ埋めでよくあるエラー・疑問
7-1. ToString("D4")が使えないケース
ToString("D4") は整数向けの書式指定です。そのため、文字列に対してはそのまま使えません。
C#string value = "7";
// value.ToString("D4"); // コンパイルエラー
文字列をゼロ埋めしたい場合は、PadLeft を使います。
C#string value = "7";
string result = value.PadLeft(4, '0');
Console.WriteLine(result); // 0007
また、小数に対して D4 を使うこともできません。
C#double value = 7.5;
// value.ToString("D4"); // FormatException
小数を整形する場合は、F2 や 000.00 のような書式を使います。
C#double value = 7.5;
Console.WriteLine(value.ToString("F2")); // 7.50
Console.WriteLine(value.ToString("000.00")); // 007.50
7-2. 小数にD書式指定子を使うとエラーになる理由
D 書式指定子は、decimal integer、つまり10進整数用の書式です。
そのため、double や float、decimal などの小数型に D4 を指定するとエラーになります。
C#decimal price = 12.3m;
// Console.WriteLine(price.ToString("D4")); // FormatException
小数の桁数をそろえたい場合は、固定小数点書式を使います。
C#decimal price = 12.3m;
Console.WriteLine(price.ToString("F2")); // 12.30
整数部分もゼロ埋めしたい場合は、カスタム数値書式を使います。
C#decimal price = 12.3m;
Console.WriteLine(price.ToString("000.00")); // 012.30
整数には D4、小数には F2 や 000.00 と覚えておくと混乱しにくくなります。
7-3. PadLeftで0が追加されない原因
PadLeft で0が追加されない場合、元の文字列がすでに指定した長さ以上である可能性があります。
C#string value = "1234";
string result = value.PadLeft(4, '0');
Console.WriteLine(result); // 1234
この場合、すでに4文字あるため、0は追加されません。
指定した長さより長い場合も、そのまま返されます。
C#string value = "12345";
string result = value.PadLeft(4, '0');
Console.WriteLine(result); // 12345
また、第2引数に全角の 0 を指定していると、半角の 0 ではなく全角文字で埋められます。
C#string value = "7";
Console.WriteLine(value.PadLeft(4, '0')); // 0007
Console.WriteLine(value.PadLeft(4, '0')); // 0007
半角ゼロで埋めたい場合は、必ず '0' を指定します。
7-4. 数値として保存すると先頭の0が消える理由
先頭の0は、数値としては意味を持ちません。
たとえば、0007 という表示は見た目上は4桁ですが、数値としては 7 と同じです。
C#int num = int.Parse("0007");
Console.WriteLine(num); // 7
これはC#に限らず、数値として扱う場合の基本的な性質です。
先頭の0を保持したい場合は、文字列として保存する必要があります。
C#string code = "0007";
Console.WriteLine(code); // 0007
データベースに保存する場合も同じです。会員番号や商品コードのように先頭の0に意味がある値は、数値型ではなく文字列型で保存することを検討しましょう。
7-5. ゼロ埋めした値を数値として扱うべきか文字列として扱うべきか
ゼロ埋めした値を数値として扱うべきか、文字列として扱うべきかは、その値の意味によって決まります。
計算に使う値であれば、数値として保持し、表示するときだけゼロ埋めします。
C#int count = 7;
string displayCount = count.ToString("D4");
Console.WriteLine(displayCount); // 0007
一方、会員番号や商品コードのように、計算しない識別子であれば文字列として扱う方が安全です。
C#string memberCode = "000007";
Console.WriteLine(memberCode); // 000007
判断基準は、「足し算や引き算をする値かどうか」です。
計算するなら数値、識別するためのコードなら文字列、と考えると分かりやすいです。
7-6. 全角0ではなく半角0で埋める方法
半角の0でゼロ埋めしたい場合は、'0' を指定します。
C#string value = "7";
string result = value.PadLeft(4, '0');
Console.WriteLine(result); // 0007
全角の 0 を指定すると、全角ゼロで埋められます。
C#string value = "7";
string result = value.PadLeft(4, '0');
Console.WriteLine(result); // 0007
通常のシステム連携やコード生成では、半角の 0 を使うことがほとんどです。
ToString("D4") や $"{num:D4}" を使う場合は、通常は半角の0で表示されます。
C#int num = 7;
Console.WriteLine(num.ToString("D4")); // 0007
Console.WriteLine($"{num:D4}"); // 0007
8. C#のゼロ埋めで押さえておきたい実装ポイント
8-1. 表示用のゼロ埋めとデータ保存用の値を分ける
ゼロ埋めは、基本的には表示用の整形処理として考えるのが安全です。
たとえば、注文IDを数値として管理し、画面表示だけゼロ埋めする場合です。
C#int orderId = 123;
string displayOrderId = orderId.ToString("D8");
Console.WriteLine(displayOrderId); // 00000123
この場合、保存する値は 123、表示する値は 00000123 です。
表示用の文字列をそのまま計算に使ったり、数値として再変換したりすると、処理が分かりにくくなります。
C#int orderId = 123;
string displayOrderId = orderId.ToString("D8");
// 表示用
Console.WriteLine(displayOrderId);
// 処理用
int nextOrderId = orderId + 1;
ただし、会員番号や商品コードのように先頭の0が値の一部である場合は、最初から文字列として保存する方が適しています。
C#string memberCode = "00000123";
8-2. 桁数を固定値にせず定数化する
ゼロ埋めの桁数をコード中に直接書くと、後から変更するときに修正漏れが起きやすくなります。
C#string id1 = orderId.ToString("D8");
string id2 = customerId.ToString("D8");
複数箇所で同じ桁数を使う場合は、定数化すると保守しやすくなります。
C#const int OrderIdDigits = 8;
int orderId = 123;
string displayOrderId = orderId.ToString("D" + OrderIdDigits);
Console.WriteLine(displayOrderId); // 00000123
接頭辞も含めて定義しておくと、仕様変更に対応しやすくなります。
C#const int ProductCodeDigits = 6;
const string ProductPrefix = "P";
int productNo = 45;
string productCode = $"{ProductPrefix}{productNo.ToString("D" + ProductCodeDigits)}";
Console.WriteLine(productCode); // P000045
8-3. 共通メソッド化して再利用しやすくする
同じゼロ埋め処理を何度も書く場合は、共通メソッドにするとコードがすっきりします。
C#static string FormatOrderId(int orderId)
{
const int OrderIdDigits = 8;
return orderId.ToString("D" + OrderIdDigits);
}
使う側は、細かい桁数を意識せずに呼び出せます。
C#int orderId = 123;
Console.WriteLine(FormatOrderId(orderId)); // 00000123
文字列用の共通メソッドを用意することもできます。
C#static string ZeroPad(string value, int length)
{
if (value == null)
{
throw new ArgumentNullException(nameof(value));
}
return value.PadLeft(length, '0');
}
使用例です。
C#string code = "123";
Console.WriteLine(ZeroPad(code, 6)); // 000123
数値用と文字列用を分けておくと、意図しない型変換を防ぎやすくなります。
8-4. テストすべき境界値
ゼロ埋め処理では、正常な値だけでなく境界値もテストすることが大切です。
たとえば、4桁でゼロ埋めする場合は、次のような値を確認します。
C#Console.WriteLine(0.ToString("D4")); // 0000
Console.WriteLine(1.ToString("D4")); // 0001
Console.WriteLine(999.ToString("D4")); // 0999
Console.WriteLine(9999.ToString("D4")); // 9999
Console.WriteLine(10000.ToString("D4")); // 10000
負の数を許可しない仕様であれば、負数もテスト対象にします。
C#Console.WriteLine((-1).ToString("D4")); // -0001
文字列の場合は、空文字、指定桁数未満、指定桁数ちょうど、指定桁数超過、null を確認します。
C#Console.WriteLine("".PadLeft(4, '0')); // 0000
Console.WriteLine("1".PadLeft(4, '0')); // 0001
Console.WriteLine("1234".PadLeft(4, '0')); // 1234
Console.WriteLine("12345".PadLeft(4, '0')); // 12345
null はそのまま PadLeft できないため、仕様に応じて例外にするか空文字として扱うかを決めておきます。
8-5. 実務で使いやすいゼロ埋めコード例
実務では、用途ごとにメソッド化しておくと便利です。
注文番号を8桁で表示する例です。
C#static string FormatOrderNo(int orderNo)
{
if (orderNo < 0)
{
throw new ArgumentOutOfRangeException(nameof(orderNo), "注文番号に負の値は指定できません。");
}
const int Digits = 8;
return orderNo.ToString("D" + Digits);
}
使用例です。
C#int orderNo = 123;
string displayOrderNo = FormatOrderNo(orderNo);
Console.WriteLine(displayOrderNo); // 00000123
商品コードを接頭辞付きで作る例です。
C#static string FormatProductCode(int productNo)
{
if (productNo < 0)
{
throw new ArgumentOutOfRangeException(nameof(productNo));
}
const int Digits = 6;
return $"P{productNo:D6}";
}
使用例です。
C#Console.WriteLine(FormatProductCode(45)); // P000045
文字列コードをゼロ埋めする例です。
C#static string FormatCode(string code, int length)
{
if (string.IsNullOrWhiteSpace(code))
{
throw new ArgumentException("コードが指定されていません。", nameof(code));
}
if (code.Length > length)
{
throw new ArgumentException("コードが指定桁数を超えています。", nameof(code));
}
return code.PadLeft(length, '0');
}
使用例です。
C#Console.WriteLine(FormatCode("123", 6)); // 000123
表示用のゼロ埋めなのか、コードそのものとしてのゼロ埋めなのかを分けて実装すると、後から仕様変更があっても対応しやすくなります。
まとめ
C#でゼロ埋めする方法は、主に ToString、PadLeft、文字列補間の3つです。
整数をゼロ埋めする場合は、ToString("D4") を使うのが基本です。
C#int num = 7;
string result = num.ToString("D4");
Console.WriteLine(result); // 0007
文字列をゼロ埋めする場合は、PadLeft(桁数, '0') を使います。
C#string value = "7";
string result = value.PadLeft(4, '0');
Console.WriteLine(result); // 0007
文字列の中に値を埋め込みながらゼロ埋めしたい場合は、文字列補間が便利です。
C#int num = 7;
string fileName = $"file_{num:D4}.txt";
Console.WriteLine(fileName); // file_0007.txt
小数には D 書式指定子は使えないため、F2 や 000.00 のような書式を使います。
C#double value = 7.5;
Console.WriteLine(value.ToString("F2")); // 7.50
Console.WriteLine(value.ToString("000.00")); // 007.50
日付や時刻では、yyyy/MM/dd や HH:mm:ss のような日付書式を使うことで、月、日、時、分、秒をゼロ埋めできます。
C#DateTime date = new DateTime(2026, 4, 5, 9, 7, 0);
Console.WriteLine(date.ToString("yyyy/MM/dd HH:mm:ss")); // 2026/04/05 09:07:00
使い分けのポイントは、元の値が数値なのか文字列なのかです。数値の表示には ToString または文字列補間、文字列の桁合わせには PadLeft を使いましょう。
また、ゼロ埋めした値を保存するのか、表示だけに使うのかも重要です。計算に使う値は数値として保持し、表示時だけゼロ埋めします。一方、会員番号や商品コードのように先頭の0に意味がある値は、文字列として扱うのが安全です。
C#のゼロ埋めは基本を押さえれば難しくありません。ToString("D4")、PadLeft(4, '0')、$"{num:D4}" の3つを状況に応じて使い分けることで、読みやすく保守しやすいコードを書けます。

