C#の0埋め完全ガイド|ToString・PadLeft・String.Formatで桁数指定する方法
はじめに
C#で数値や文字列を一定の桁数にそろえたい場合は、先頭に「0」を追加する0埋め(ゼロパディング)を利用します。たとえば、数値の7を2桁の07、4桁の0007として表示する処理です。
C#で0埋めする代表的な方法には、次の3つがあります。
数値を書式指定して変換する
ToString文字列の左側を指定文字で埋める
PadLeft書式付き文字列を作成する
String.Format
どの方法でも似た結果を得られますが、処理するデータが数値なのか文字列なのかによって、適切な方法は異なります。
この記事では、C#で0埋めする方法を、桁数指定、動的な桁数、負の数、小数、カルチャの扱いまで含めて詳しく解説します。
1. C#で0埋め(ゼロパディング)する基本
1-1. 0埋めとは何か
0埋めとは、データの桁数が指定した長さに満たない場合に、先頭へ0を追加して桁数をそろえる処理です。
たとえば、数値の25を5桁で表示すると、次のようになります。
00025
C#では、次のような場面で0埋めが使われます。
商品番号や会員番号を固定桁で表示する
月、日、時、分を2桁で表示する
連番を
0001、0002の形式で出力するCSVや固定長ファイルのフォーマットを整える
ログファイル名や画像ファイル名の桁数をそろえる
注意したいのは、0埋めした結果は基本的に文字列になることです。
C#int number = 25;
string result = number.ToString("00000");
Console.WriteLine(result); // 00025
元のnumberは整数の25のままであり、数値そのものに先頭の0が保存されるわけではありません。
1-2. 数値と文字列で0埋めの方法が異なる理由
数値型では、先頭の0に数値としての意味がありません。
たとえば、次の文字列を整数へ変換すると、先頭の0は失われます。
C#string text = "00025";
int number = int.Parse(text);
Console.WriteLine(number); // 25
そのため、intやlongなどの数値を0埋めするときは、表示用の文字列へ変換する際に書式を指定します。
C#int number = 25;
string result = number.ToString("00000");
一方、すでに文字列として保持されているデータは、数値書式を直接指定できません。文字列の左側へ文字を追加するPadLeftを使用します。
C#string text = "25";
string result = text.PadLeft(5, '0');
Console.WriteLine(result); // 00025
数値にはToString、文字列にはPadLeftを使うのが基本です。
1-3. 桁数指定でよく使う3つの方法
C#で0埋めする代表的な方法は、ToString、PadLeft、String.Formatの3つです。
C#int number = 25;
// ToString
string result1 = number.ToString("00000");
// PadLeft
string result2 = number.ToString().PadLeft(5, '0');
// String.Format
string result3 = String.Format("{0:00000}", number);
Console.WriteLine(result1); // 00025
Console.WriteLine(result2); // 00025
Console.WriteLine(result3); // 00025
3つとも同じ結果になりますが、用途が異なります。
ToStringは、数値を単独で0埋めした文字列に変換するときに適しています。コードが短く、数値の書式を明確に表現できます。
PadLeftは、文字列を指定した長さまで0で埋める方法です。入力値が文字列として渡される場合に向いています。
String.Formatは、文章や複数の値を組み合わせながら書式を指定するときに便利です。
1-4. 目的別に選ぶべき0埋め方法
数値を0埋めするだけなら、基本的にはToStringを選びます。
C#int number = 7;
string result = number.ToString("000");
入力値が文字列なら、PadLeftを使用します。
C#string code = "7";
string result = code.PadLeft(3, '0');
複数の値を含む文章を作成する場合は、String.Formatが選択肢になります。
C#int number = 7;
string result = String.Format("商品番号:{0:000}", number);
目的別に整理すると、次のようになります。
| 目的 | 適した方法 |
|---|---|
| 数値を0埋めして文字列に変換する | ToString |
| 文字列を指定した長さまで0埋めする | PadLeft |
| 文章内の数値を0埋めする | String.Format |
| 桁数を変数で変更する | ToStringまたはPadLeft |
| 負の数を自然な形式で0埋めする | ToString |
2. ToStringで数値を0埋めする方法
2-1. 「0」書式指定子で桁数を指定する基本構文
数値型のToStringメソッドでは、カスタム数値書式指定文字の0を使って桁数を指定できます。
基本構文は次のとおりです。
C#数値.ToString("必要な桁数分の0")
4桁で0埋めする場合は、書式として"0000"を指定します。
C#int number = 42;
string result = number.ToString("0000");
Console.WriteLine(result); // 0042
書式文字列に記述した0の個数が、最低限表示する桁数になります。
C#int number = 42;
Console.WriteLine(number.ToString("00")); // 42
Console.WriteLine(number.ToString("000")); // 042
Console.WriteLine(number.ToString("0000")); // 0042
Console.WriteLine(number.ToString("00000")); // 00042
標準数値書式指定子のDを使って、整数を0埋めすることもできます。
C#int number = 42;
string result = number.ToString("D4");
Console.WriteLine(result); // 0042
"0000"は小数を含む柔軟な書式指定が可能です。"D4"は整数を指定桁数で表す用途に適しています。
2-2. 1桁の数値を2桁・3桁・4桁に0埋めする例
1桁の数値を2桁にする場合は、"00"を指定します。
C#int number = 7;
string result = number.ToString("00");
Console.WriteLine(result); // 07
3桁にする場合は"000"です。
C#int number = 7;
string result = number.ToString("000");
Console.WriteLine(result); // 007
4桁にする場合は"0000"を指定します。
C#int number = 7;
string result = number.ToString("0000");
Console.WriteLine(result); // 0007
複数の数値を連番として表示する場合にも利用できます。
C#for (int i = 1; i <= 5; i++)
{
Console.WriteLine(i.ToString("000"));
}
実行結果は次のとおりです。
001
002
003
004
005
ファイル名へ連番を含める場合は、次のように記述できます。
C#int fileNumber = 8;
string fileName = $"image_{fileNumber.ToString("0000")}.jpg";
Console.WriteLine(fileName); // image_0008.jpg
固定の桁数であれば、文字列補間の書式指定を使うと簡潔です。
C#int fileNumber = 8;
string fileName = $"image_{fileNumber:0000}.jpg";
Console.WriteLine(fileName); // image_0008.jpg
2-3. 変数で桁数を動的に指定する方法
0埋めする桁数が実行時に変わる場合は、new stringを使って必要な個数の0を生成します。
C#int number = 42;
int digits = 6;
string format = new string('0', digits);
string result = number.ToString(format);
Console.WriteLine(result); // 000042
メソッドとしてまとめると、繰り返し利用しやすくなります。
C#static string ZeroPad(int value, int digits)
{
if (digits < 1)
{
throw new ArgumentOutOfRangeException(
nameof(digits),
"桁数は1以上を指定してください。");
}
return value.ToString(new string('0', digits));
}
使用例は次のとおりです。
C#Console.WriteLine(ZeroPad(7, 2)); // 07
Console.WriteLine(ZeroPad(7, 4)); // 0007
Console.WriteLine(ZeroPad(7, 6)); // 000007
整数に限定する場合は、標準数値書式のDと桁数を組み合わせる方法もあります。
C#int number = 42;
int digits = 6;
string result = number.ToString($"D{digits}");
Console.WriteLine(result); // 000042
D書式は整数型向けです。小数の書式を動的に作成する場合は、new string('0', digits)を使う方法が適しています。
2-4. 指定桁数を超える数値を変換した場合の挙動
ToStringの0書式指定は、表示する最低桁数を指定するものです。数値の桁数が指定桁数を超えていても、上位の桁が切り捨てられることはありません。
C#int number = 12345;
string result = number.ToString("000");
Console.WriteLine(result); // 12345
3桁を指定していますが、元の数値が5桁であるため、そのまま12345と出力されます。
C#Console.WriteLine(7.ToString("000")); // 007
Console.WriteLine(123.ToString("000")); // 123
Console.WriteLine(1234.ToString("000")); // 1234
指定桁数を超えた値を一定の長さに切り詰めたい場合は、0埋めとは別の処理が必要です。ただし、識別番号や連番を安易に切り詰めると値が重複する可能性があるため、通常は入力値の範囲を検証します。
C#static string FormatNumber(int value, int digits)
{
int maxValue = (int)Math.Pow(10, digits) - 1;
if (value < 0 || value > maxValue)
{
throw new ArgumentOutOfRangeException(nameof(value));
}
return value.ToString(new string('0', digits));
}
2-5. 負の数をToStringで0埋めする場合の挙動
負の数をToStringで0埋めすると、マイナス記号の後ろに0が追加されます。
C#int number = -42;
string result = number.ToString("0000");
Console.WriteLine(result); // -0042
書式文字列の0は数値部分の最低桁数を表します。マイナス記号は桁数に含まれないため、"0000"を指定した結果の文字数は5文字になります。
C#int number = -7;
string result = number.ToString("000");
Console.WriteLine(result); // -007
Console.WriteLine(result.Length); // 4
マイナス記号を含めて全体を4文字にしたい場合は、絶対値を3桁で0埋めしてから符号を付けます。
C#int number = -7;
int totalWidth = 4;
string result = number < 0
? "-" + Math.Abs(number).ToString(new string('0', totalWidth - 1))
: number.ToString(new string('0', totalWidth));
Console.WriteLine(result); // -007
なお、int.MinValueに対してMath.Abs(int.MinValue)を呼び出すとオーバーフローするため、すべてのintを扱う場合はlongへ変換してから処理すると安全です。
C#int number = int.MinValue;
long absoluteValue = Math.Abs((long)number);
string result = "-" + absoluteValue.ToString();
2-6. 小数を整数部・小数部ともに0埋めする方法
小数では、小数点の前後に0書式指定子を記述します。
C#double number = 12.3;
string result = number.ToString("000.00");
Console.WriteLine(result); // 012.30
"000.00"の意味は次のとおりです。
整数部を最低3桁で表示する
小数部を2桁で表示する
足りない桁を0で埋める
さまざまな値を変換すると、次の結果になります。
C#Console.WriteLine(1.2.ToString("000.00")); // 001.20
Console.WriteLine(12.34.ToString("000.00")); // 012.34
Console.WriteLine(123.4.ToString("000.00")); // 123.40
Console.WriteLine(1234.5.ToString("000.00")); // 1234.50
小数部の桁数を超える値がある場合は、指定した桁数に丸められます。
C#double number = 12.3456;
string result = number.ToString("000.00");
Console.WriteLine(result); // 012.35
金額など、10進数として正確に扱いたい値にはdoubleではなくdecimalを使うのが一般的です。
C#decimal price = 7.5m;
string result = price.ToString("0000.00");
Console.WriteLine(result); // 0007.50
整数部と小数部の桁数を変数で指定することもできます。
C#decimal number = 12.3m;
int integerDigits = 4;
int decimalDigits = 3;
string format =
new string('0', integerDigits) +
"." +
new string('0', decimalDigits);
string result = number.ToString(format);
Console.WriteLine(result); // 0012.300
2-7. カルチャに依存せず0埋めする方法
整数だけを0埋めする場合、カルチャによる違いは通常ほとんどありません。ただし、小数点や桁区切り記号を含む書式は、実行環境のカルチャによって変化します。
カルチャに依存しない形式で出力したい場合は、CultureInfo.InvariantCultureを指定します。
C#using System.Globalization;
decimal number = 12.3m;
string result = number.ToString(
"000.00",
CultureInfo.InvariantCulture);
Console.WriteLine(result); // 012.30
InvariantCultureを指定すると、小数点には常に.が使用されます。API、CSV、ログ、設定ファイルなど、環境にかかわらず同じ形式で保存したい場合に適しています。
桁数を動的に指定する場合も、同様にカルチャを渡せます。
C#using System.Globalization;
int number = 42;
int digits = 5;
string format = new string('0', digits);
string result = number.ToString(
format,
CultureInfo.InvariantCulture);
Console.WriteLine(result); // 00042
現在のカルチャを明示したい場合は、CultureInfo.CurrentCultureを指定します。
C#using System.Globalization;
decimal number = 12.3m;
string result = number.ToString(
"000.00",
CultureInfo.CurrentCulture);
人が読む画面表示には現在のカルチャ、システム間で交換するデータにはInvariantCultureを使うと整理しやすくなります。
3. PadLeftで文字列を0埋めする方法
3-1. PadLeftの基本構文と使い方
PadLeftは、文字列が指定した長さになるまで左側へ文字を追加するメソッドです。
基本構文は次のとおりです。
C#文字列.PadLeft(全体の文字数, 埋める文字)
文字列"42"を5文字になるまで0埋めする例です。
C#string text = "42";
string result = text.PadLeft(5, '0');
Console.WriteLine(result); // 00042
第1引数の5は、追加する0の個数ではなく、変換後の文字列全体の長さです。
C#string text = "42";
Console.WriteLine(text.PadLeft(3, '0')); // 042
Console.WriteLine(text.PadLeft(4, '0')); // 0042
Console.WriteLine(text.PadLeft(5, '0')); // 00042
第2引数を省略すると、空白文字で埋められます。
C#string text = "42";
string result = text.PadLeft(5);
Console.WriteLine($"[{result}]"); // [ 42]
0埋めする場合は、必ず第2引数に文字の'0'を指定します。文字列の"0"ではなく、シングルクォーテーションで囲んだchar型を渡します。
C#string result = text.PadLeft(5, '0');
3-2. 数字の文字列を指定桁数まで0埋めする例
数字を文字列として保持している場合は、PadLeftをそのまま使用できます。
C#string code = "8";
string result = code.PadLeft(4, '0');
Console.WriteLine(result); // 0008
2桁の文字列を6桁にする例です。
C#string code = "25";
string result = code.PadLeft(6, '0');
Console.WriteLine(result); // 000025
商品コードなど、数字だけで構成されていても数値計算を行わないデータは、最初から文字列として扱うことがあります。
C#string productCode = "123";
string formattedCode = productCode.PadLeft(8, '0');
Console.WriteLine(formattedCode); // 00000123
先頭の0そのものがデータの一部である場合は、数値へ変換しないように注意してください。
C#string code = "00123";
int number = int.Parse(code);
Console.WriteLine(number); // 123
コード、郵便番号、電話番号、会員番号などは、計算対象ではないため、数値型より文字列型が適している場合があります。
3-3. 数値を文字列に変換してからPadLeftを使う方法
数値にPadLeftを直接使用することはできません。一度ToStringで文字列へ変換してから呼び出します。
C#int number = 42;
string result = number.ToString().PadLeft(5, '0');
Console.WriteLine(result); // 00042
変数へ分けて記述すると、処理内容が分かりやすくなります。
C#int number = 42;
string text = number.ToString();
string result = text.PadLeft(5, '0');
Console.WriteLine(result); // 00042
ただし、数値を0埋めするだけなら、通常はToStringの書式指定を使うほうが自然です。
C#int number = 42;
string result = number.ToString("00000");
PadLeftは、数値以外の文字列にも使える点が特徴です。
C#string code = "AB12";
string result = code.PadLeft(8, '0');
Console.WriteLine(result); // 0000AB12
3-4. 桁数を変数で指定する方法
PadLeftの第1引数には整数を渡すため、変数で桁数を簡単に指定できます。
C#string text = "42";
int digits = 6;
string result = text.PadLeft(digits, '0');
Console.WriteLine(result); // 000042
数値を変換する場合も同様です。
C#int number = 42;
int digits = 6;
string result = number
.ToString()
.PadLeft(digits, '0');
Console.WriteLine(result); // 000042
メソッドとしてまとめる場合は、次のように記述できます。
C#static string ZeroPad(string value, int totalWidth)
{
if (value is null)
{
throw new ArgumentNullException(nameof(value));
}
if (totalWidth < 0)
{
throw new ArgumentOutOfRangeException(nameof(totalWidth));
}
return value.PadLeft(totalWidth, '0');
}
使用例です。
C#Console.WriteLine(ZeroPad("7", 2)); // 07
Console.WriteLine(ZeroPad("7", 4)); // 0007
Console.WriteLine(ZeroPad("25", 6)); // 000025
3-5. 元の文字列が指定桁数以上の場合の挙動
元の文字列が指定した長さ以上の場合、PadLeftによって文字列が切り詰められることはありません。
C#string text = "12345";
Console.WriteLine(text.PadLeft(3, '0')); // 12345
Console.WriteLine(text.PadLeft(5, '0')); // 12345
Console.WriteLine(text.PadLeft(7, '0')); // 0012345
PadLeftは、不足している文字数を補うためのメソッドです。指定した長さを超えた文字列を固定長に収める機能はありません。
入力値を必ず指定桁数以内に制限したい場合は、事前に長さを確認します。
C#string text = "12345";
int digits = 4;
if (text.Length > digits)
{
throw new ArgumentException(
$"値は{digits}文字以内で指定してください。",
nameof(text));
}
string result = text.PadLeft(digits, '0');
末尾から指定文字数を取得する処理も可能ですが、データが失われます。
C#string text = "12345";
int digits = 4;
string result = text.Length > digits
? text[^digits..]
: text.PadLeft(digits, '0');
Console.WriteLine(result); // 2345
識別番号などの重要なデータでは、切り捨てるよりもエラーとして扱うほうが安全です。
3-6. 負の数にPadLeftを使う際の注意点
負の数を文字列へ変換してからPadLeftを使うと、マイナス記号を含む文字列全体の左側に0が追加されます。
C#int number = -42;
string result = number.ToString().PadLeft(5, '0');
Console.WriteLine(result); // 00-42
一般的に期待される-0042にはならないため、負の数に対して単純にPadLeftを使用するのは避けたほうがよいでしょう。
負の数を含む数値では、ToStringの数値書式を使用するのが簡単です。
C#int number = -42;
string result = number.ToString("0000");
Console.WriteLine(result); // -0042
PadLeftを使う必要がある場合は、符号と数値部分を分けて処理します。
C#int number = -42;
int digits = 4;
long absoluteValue = Math.Abs((long)number);
string paddedNumber = absoluteValue
.ToString()
.PadLeft(digits, '0');
string result = number < 0
? "-" + paddedNumber
: paddedNumber;
Console.WriteLine(result); // -0042
この例では、digitsは符号を除いた数値部分の桁数です。
符号を含めた全体の長さを指定したい場合は、負の数のときだけ1文字減らします。
C#int number = -42;
int totalWidth = 5;
long absoluteValue = Math.Abs((long)number);
string result = number < 0
? "-" + absoluteValue
.ToString()
.PadLeft(totalWidth - 1, '0')
: absoluteValue
.ToString()
.PadLeft(totalWidth, '0');
Console.WriteLine(result); // -0042
3-7. nullや空文字を0埋めする際の注意点
nullに対してPadLeftを呼び出すと、NullReferenceExceptionが発生します。
C#string? text = null;
// NullReferenceException
string result = text.PadLeft(5, '0');
nullの可能性がある場合は、事前に確認します。
C#string? text = null;
string result = text is null
? string.Empty
: text.PadLeft(5, '0');
Console.WriteLine(result); // 空文字
nullを空文字として扱い、そのまま指定桁数まで0埋めする場合は、null合体演算子を使えます。
C#string? text = null;
string result = (text ?? string.Empty)
.PadLeft(5, '0');
Console.WriteLine(result); // 00000
空文字にPadLeftを使用すると、指定した個数の0だけで構成された文字列になります。
C#string text = string.Empty;
string result = text.PadLeft(5, '0');
Console.WriteLine(result); // 00000
空白文字列にも注意が必要です。
C#string text = " ";
string result = text.PadLeft(5, '0');
Console.WriteLine($"[{result}]"); // [0000 ]
空白は1文字として扱われるため、結果の末尾に空白が残ります。空白を未入力として扱う場合は、string.IsNullOrWhiteSpaceを使用します。
C#string? text = " ";
string result = string.IsNullOrWhiteSpace(text)
? "00000"
: text.PadLeft(5, '0');
Console.WriteLine(result); // 00000
業務上の要件によって、nullや空文字を次のどれとして扱うかを明確にしておくことが重要です。
エラーにする
空文字のままにする
指定桁数の0へ変換する
既定値を設定する
4. String.Formatで数値を0埋めする方法
4-1. String.Formatの基本構文
String.Formatは、書式文字列のプレースホルダーへ値を埋め込んで文字列を作成するメソッドです。
基本構文は次のとおりです。
C#String.Format("{インデックス:書式}", 値)
数値の42を5桁で0埋めする場合は、次のように記述します。
C#int number = 42;
string result = String.Format("{0:00000}", number);
Console.WriteLine(result); // 00042
{0}の0は、1番目の引数を表すインデックスです。コロンの後ろに、数値の書式を指定します。
C#int number = 7;
Console.WriteLine(String.Format("{0:00}", number)); // 07
Console.WriteLine(String.Format("{0:000}", number)); // 007
Console.WriteLine(String.Format("{0:0000}", number)); // 0007
複数の値を含む文字列も作成できます。
C#int year = 2026;
int month = 6;
int day = 5;
string result = String.Format(
"{0:0000}/{1:00}/{2:00}",
year,
month,
day);
Console.WriteLine(result); // 2026/06/05
文章の中へ0埋めした値を埋め込むこともできます。
C#int orderNumber = 25;
string message = String.Format(
"注文番号は{0:000000}です。",
orderNumber);
Console.WriteLine(message);
// 注文番号は000025です。
現在のC#では、固定の書式なら文字列補間でも同じ処理を簡潔に記述できます。
C#int orderNumber = 25;
string message = $"注文番号は{orderNumber:000000}です。";
Console.WriteLine(message);
// 注文番号は000025です。
既存コードで複合書式指定が使われている場合や、書式文字列を外部で管理する場合には、String.Formatが便利です。
4-2. プレースホルダー内で桁数を指定する方法
String.Formatでは、プレースホルダーのコロン以降に必要な桁数分の0を記述します。
C#int number = 12;
string result = String.Format(
"{0:0000}",
number);
Console.WriteLine(result); // 0012
標準数値書式のDを使うこともできます。
C#int number = 12;
string result = String.Format("{0:D4}", number);
Console.WriteLine(result); // 0012
小数を0埋めする場合は、整数部と小数部の両方に書式を指定します。
C#decimal number = 12.3m;
string result = String.Format("{0:000.00}", number);
Console.WriteLine(result); // 012.30
桁数を変数で指定する場合は、書式文字列を動的に作成します。
C#int number = 42;
int digits = 6;
string zeroFormat = new string('0', digits);
string format = "{0:" + zeroFormat + "}";
string result = String.Format(format, number);
Console.WriteLine(result); // 000042
文字列補間を使って書式文字列を組み立てることもできます。波かっこを文字として含めるため、{{と}}でエスケープします。
C#int number = 42;
int digits = 6;
string zeroFormat = new string('0', digits);
string format = $"{{0:{zeroFormat}}}";
string result = String.Format(format, number);
Console.WriteLine(result); // 000042
カルチャに依存しない形式へ変換する場合は、先頭の引数にCultureInfo.InvariantCultureを指定します。
C#using System.Globalization;
decimal number = 12.3m;
string result = String.Format(
CultureInfo.InvariantCulture,
"{0:000.00}",
number);
Console.WriteLine(result); // 012.30
String.Formatでも、指定した桁数を超える数値は切り捨てられません。
C#int number = 12345;
string result = String.Format("{0:000}", number);
Console.WriteLine(result); // 12345
負の数の場合は、マイナス記号の後ろに0が追加されます。
C#int number = -42;
string result = String.Format("{0:0000}", number);
Console.WriteLine(result); // -0042
まとめ
C#で0埋めする方法は、対象となるデータ型や用途によって使い分けます。
数値を指定桁数で0埋めする場合は、ToStringの書式指定が基本です。
C#int number = 42;
string result = number.ToString("00000");
// 00042
文字列を指定した長さまで0埋めする場合は、PadLeftを使用します。
C#string text = "42";
string result = text.PadLeft(5, '0');
// 00042
文章内の数値を書式付きで埋め込む場合は、String.Formatを使用できます。
C#int number = 42;
string result = String.Format(
"番号:{0:00000}",
number);
// 番号:00042
桁数を変数で指定する場合は、new string('0', digits)で書式を生成できます。
C#int number = 42;
int digits = 6;
string result = number.ToString(
new string('0', digits));
// 000042
数値を扱う場合はToString、文字列を扱う場合はPadLeft、複数の値を含む書式付き文字列にはString.Formatを選ぶと、意図の分かりやすいコードになります。
また、指定桁数は最大長ではなく最低限の表示桁数です。元の値が指定桁数を超えていても切り捨てられません。負の数にPadLeftを使うと00-42のような形式になるため、負数にはToStringの数値書式を使うのが安全です。
小数点記号などを環境に依存しない形式で出力する必要がある場合は、CultureInfo.InvariantCultureを指定しましょう。

