C#でプログラミングを行っている際、数値や文字列の桁数を揃えたい場面は頻繁に登場します。
例えば、社員番号を「0001」のように4桁で統一したり、ログ出力の時間を「09:05」のように2桁で固定したりする場合です。
このような「特定の文字で埋めて桁数を整える処理」をパディングと呼び、C#ではPadLeftメソッドを利用することで簡単に実現できます。
本記事では、PadLeftを用いたゼロ埋めの基本から、より実戦的な数値フォーマットとの使い分けまで、初心者の方にもわかりやすく徹底的に解説します。
PadLeftメソッドの基本概念
C#のPadLeftメソッドは、文字列を指定した長さになるまで、左側に特定の文字を追加するためのメソッドです。
主に、数値データを文字列として扱う際に、見た目を整える目的で使用されます。

PadLeftはStringクラスのインスタンスメソッドであり、戻り値として新しく生成された文字列を返します。
元の文字列自体が書き換わるわけではないという点に注意が必要です。
PadLeftの構文と引数の意味
PadLeftには、主に2種類のオーバーロードが存在します。
ゼロ埋めを行いたい場合は、2つ目の「埋める文字を指定する」形式を頻繁に利用します。
public string PadLeft(int totalWidth)public string PadLeft(int totalWidth, char paddingChar)
第1引数:totalWidth (合計桁数)
この引数には、最終的に出力したい文字列の長さを指定します。
例えば、5桁の数値を作りたい場合は「5」を指定します。
もし元の文字列がすでに指定した長さ以上の場合は、何も追加されず元の文字列がそのまま返されます。
第2引数:paddingChar (埋める文字)
左側の空いたスペースを埋めるための文字を指定します。
ゼロ埋めをしたい場合は、文字リテラルとして'0'を渡します。
引数を省略した場合は、半角スペースで埋められます。
PadLeftでゼロ埋めを実装する具体的なコード
それでは、実際にPadLeftを使って数値をゼロ埋めするコードを見てみましょう。
数値型(intなど)に対して直接使うことはできないため、一度文字列に変換してから呼び出すのが一般的な流れです。
数値を5桁でゼロ埋めする例
以下のサンプルコードでは、整数型の変数を文字列に変換し、5桁になるように「0」でパディングしています。
using System;
class Program
{
static void Main()
{
// 元の数値
int number = 123;
// 1. 数値を文字列に変換
string baseString = number.ToString();
// 2. PadLeftを使って5桁になるまで '0' で埋める
string paddedString = baseString.PadLeft(5, '0');
// 結果の出力
Console.WriteLine($"元の値: {number}");
Console.WriteLine($"ゼロ埋め後: {paddedString}");
}
}
元の値: 123
ゼロ埋め後: 00123
このプログラムでは、number.ToString()によって「”123″」という3文字の文字列が作られます。
その後、PadLeft(5, '0')を呼び出すことで、5文字に足りない2文字分が左側に「0」として追加され、最終的に「00123」となります。
変数の内容を直接更新する場合
string型はイミュータブル(不変)なオブジェクトであるため、メソッドを呼び出しただけでは元の変数は変わりません。
結果を保持したい場合は、新しい変数に代入するか、元の変数に再代入する必要があります。
string code = "45";
// code.PadLeft(4, '0'); // これだけでは code は "45" のまま
code = code.PadLeft(4, '0'); // 再代入することで "0045" になる
実践的な活用シーン:IDの採番とリスト処理
実際のアプリケーション開発では、データベースから取得した連番IDを整形して表示したり、ファイル名にインデックスを付与したりする際に多用されます。

ループ内での一括処理
複数のデータをまとめて処理する場合、foreachやLINQと組み合わせて利用すると非常に効率的です。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
int[] ids = { 1, 55, 128, 1024 };
Console.WriteLine("--- 商品コード一覧 ---");
foreach (int id in ids)
{
// 6桁の固定長コードとして出力
string formattedCode = id.ToString().PadLeft(6, '0');
Console.WriteLine($"商品ID: {formattedCode}");
}
}
}
--- 商品コード一覧 ---
商品ID: 000001
商品ID: 000055
商品ID: 000128
商品ID: 001024
このように、「桁数を固定する」ことで、コンソール出力やログファイルの縦のラインが綺麗に揃い、情報の読み取りミスを防ぐことができます。
PadLeftを使用する際の注意点と限界
非常に便利なPadLeftですが、万能ではありません。
特に「数値型」のデータを扱う場合には、注意すべき挙動がいくつかあります。
1. 元の文字列が指定桁数を超えている場合
PadLeftは「指定した長さに足りない場合に埋める」という動作をします。
そのため、すでに桁数を超えている場合は、文字列の切り詰め(カット)は行われません。
string longText = "123456";
// 4桁にしたいと思って PadLeft を使っても...
string result = longText.PadLeft(4, '0');
Console.WriteLine(result); // 出力: 123456 (カットされない)
もし、特定の桁数で切り詰める必要がある場合は、Substringメソッドなどを併用して別途処理を書く必要があります。
2. 負の数の扱い
数値にマイナス記号が含まれている場合、PadLeftは単純に文字列の左側に文字を追加します。
その結果、不自然な表示になることがあります。
int negativeNum = -123;
// "-123" は4文字。これを6桁でパディングすると...
string result = negativeNum.ToString().PadLeft(6, '0');
Console.WriteLine(result); // 出力: 00-123
「-00123」のように、符号を維持したままゼロ埋めを行いたい場合には、PadLeftよりも後述する「数値書式指定文字列」を使うのが最適です。
PadLeft以外のゼロ埋め方法との比較
C#にはPadLeft以外にもゼロ埋めを実現する方法がいくつか存在します。
状況に応じて使い分けられるよう、代表的なものを比較してみましょう。
| 手法 | コード例 | 特徴 |
|---|---|---|
| PadLeft | s.PadLeft(5, '0') | 文字列に対して柔軟に文字を指定できる。 |
| ToString(“D”) | n.ToString("D5") | 数値型専用。負の数も正しく扱える。一般的。 |
| 文字列補完 | $"{n:D5}" | 直感的で読みやすい。最新のC#では推奨。 |
| string.Format | string.Format("{0:D5}", n) | 複雑なメッセージ構築時に便利。 |

数値書式指定(ToString(“D”))を使うメリット
数値に対してゼロ埋めを行うなら、ToString("D" + 桁数)を使うのが最も標準的です。
これは「10進数(Decimal)フォーマット」を意味します。
int num = 42;
// D5は「5桁の10進数で、足りない分は0」という意味
Console.WriteLine(num.ToString("D5")); // 出力: 00042
この方法の優れた点は、マイナスの符号を考慮してくれる点です。
int neg = -42;
Console.WriteLine(neg.ToString("D5")); // 出力: -00042
PadLeftでは「00-42」となってしまったケースでも、ToString("D5")なら数学的に正しい表記を維持できます。
最新の書き方:文字列補完(String Interpolation)
C# 6.0以降で利用可能な「文字列補完」を使うと、より簡潔に記述できます。
変数を直接文字列の中に埋め込みつつ、書式を指定する方法です。
int id = 7;
string result = $"{id:D4}"; // $マークを付け、変数の後に :D4 を指定
Console.WriteLine(result); // 出力: 0007
現在、C#のコードを書く際はこの文字列補完を用いた書き方が最も一般的であり、コードの可読性も高くなります。
結局、PadLeftはいつ使うべきか?
数値型には専用のフォーマットがあるのなら、PadLeftの出番はないのでしょうか?
そんなことはありません。
PadLeftが真価を発揮するのは、「対象が数値ではない文字列」の場合です。
応用例:非数値文字列のパディング
例えば、アルファベットを含むシリアルコードの桁数を揃えたい場合、数値書式指定は使えません。
string prefix = "A-";
string serial = "123";
// シリアル部分だけを5桁にして結合したい
string fullCode = prefix + serial.PadLeft(5, '0');
Console.WriteLine(fullCode); // 出力: A-00123
また、「0」以外の文字で埋めたい場合(例えば、アスタリスクで伏せ字にする、ドットで目次を作るなど)もPadLeftの独壇場です。
string price = "1200";
// 金額の前にアスタリスクを並べて10桁にする
string securityFormat = price.PadLeft(10, '*');
Console.WriteLine(securityFormat); // 出力: ******1200
このように、「純粋な文字列操作としてのパディング」が必要なシーンでは、PadLeftが非常に強力なツールとなります。
パフォーマンスに関するTips
大量のデータをループ内で処理する場合、文字列の生成コストが気になることがあります。
PadLeftもToStringも、呼び出すたびに新しい文字列オブジェクトをヒープメモリ上に生成します。
数万回、数十万回といった極端な回数のゼロ埋めを行う場合は、StringBuilderクラスを検討する価値があります。
しかし、通常のWebアプリケーションやデスクトップツールの表示処理程度であれば、PadLeftや文字列補完のオーバーヘッドは無視できるレベルです。
まずは「読みやすさ」を優先してコードを書きましょう。
まとめ
C#でゼロ埋めを行う方法について解説してきました。
PadLeftは、文字列の左側に指定した文字を追加して長さを整える汎用性の高いメソッドです。
今回のポイントを整理すると以下の通りです。
PadLeft(桁数, '0')で簡単にゼロ埋めができる。- 元の文字列が指定桁数を超えている場合は、カットされずにそのまま返される。
- 数値(int型など)のゼロ埋めには、符号も考慮してくれる
ToString("D5")や文字列補完$"{val:D5}"が推奨される。 PadLeftは、数値以外の文字列をパディングしたり、「0」以外の文字で埋めたりする場合に最適である。
データの型や「負の数をどう扱うか」という要件に応じて、PadLeftと数値フォーマットを適切に使い分けることが、バグの少ない綺麗なコードへの近道です。
ぜひ、日々の開発で活用してみてください。
