パディング
文字列を指定した長さに揃えるために特定の文字を埋める処理。padStart や padEnd で実現する。
パディング (Padding) とは、文字列を指定した長さに揃えるために、先頭や末尾に特定の文字 (通常はスペースやゼロ) を埋める処理です。データの整形、表示の統一、固定長フォーマットへの変換など、プログラミングのさまざまな場面で使われる基本的な文字列操作です。たとえば、商品コード「42」を 6 桁に揃えて「000042」にする、月の数値「3」を「03」にするといった処理がパディングに該当します。
JavaScript では ES2017 で導入された padStart() と padEnd() メソッドが利用できます。'5'.padStart(3, '0') は '005' を返し、'hi'.padEnd(10, '.') は 'hi........' を返します。Python では str.zfill() でゼロ埋め、str.ljust() や str.rjust() で任意の文字によるパディングが可能です。C 言語の printf 関数でも %05d のようなフォーマット指定子でゼロパディングを実現できます。
これらの関数に共通する落とし穴は、元の文字列が指定長以上のときは何もせずそのまま返すことです。'abcdef'.padStart(3, '0') の結果は 'abcdef' で、Python の 'abcdef'.rjust(3, '0') も同じです。指定長で切り揃えてくれると誤解したまま固定長レコードを組み立てると、長い値が混じった行だけ桁がずれます。パディングと合わせて超過分を切り詰める処理を必ず入れてください。埋め文字に 2 文字以上を渡した場合は、必要な長さまで繰り返して途中で打ち切られるため、'7'.padStart(5, 'ab') は 'abab7' になります。Python の zfill() は符号を先頭に残す仕様で、'-5'.zfill(3) は '-05' です。
ゼロパディングは日付や時刻のフォーマットで特に重要です。「2024-3-5」ではなく「2024-03-05」のように表記することで、文字列としてのソートが正しく機能し、表示の統一感も保たれます。ファイル名の連番 (file001.txt、file002.txt) でもゼロパディングが使われ、OS のファイル一覧で正しい順序で表示されるようになります。金融システムでは口座番号や取引番号のゼロ埋めが必須であり、固定長レコードの生成にもパディングは欠かせません。
パディングと混同されやすい概念として、CSS の padding プロパティがあります。CSS の padding は要素の内側の余白を指定するもので、文字列操作のパディングとは全く異なる概念です。また、暗号化における padding (PKCS#7 パディングなど) はブロック暗号のデータ長を調整するための処理であり、これも文字列のパディングとは目的が異なります。文脈に応じて正しい意味を判断する必要があります。
全角文字を含む文字列のパディングでは、表示幅と文字数の不一致に注意が必要です。全角文字は通常 2 文字分の表示幅を占めるため、単純な文字数ベースのパディングではテーブルやログ出力の桁が揃いません。East Asian Width プロパティを考慮した幅ベースのパディング関数を実装するか、専用のライブラリを使用する必要があります。ただし East Asian Width には、東アジアの文脈では全角、それ以外では半角として扱われる Ambiguous という区分があり、記号類はここに含まれるものが多いため、環境によって桁の揃い方が変わります。桁を厳密に揃えたい出力では、実際の表示環境と等幅フォントで確認したうえで幅の判定規則を決めておきます。
もう一つ見落としやすいのが、JavaScript の padStart() と padEnd() が数える単位です。これらが基準にするのは UTF-16 のコードユニットで、表示幅どころか見た目の文字数とも一致しません。サロゲートペアで表される絵文字は 2 コードユニットを占めるため、'👍'.padStart(3, '*') の結果は '*👍' となり、3 文字幅に揃えたつもりでも埋め文字は 1 つしか付きません。絵文字や結合文字を含む可能性があるデータでは、数え方を書記素クラスタ単位に揃えるか、そもそもパディングで桁を揃える設計を避けるのが安全です。
文字数カウントの観点では、パディングによって追加された文字も当然カウント対象になります。パディング前後で文字数がどれだけ変化するかを把握することは、固定長フォーマットの設計やバリデーションにおいて重要です。文字数カウントツールを使えば、パディング後の文字列が仕様で定められた長さに正しく揃っているかを簡単に確認できます。