何をしたいユーティリティか:「固定長整形」
ここでの「固定長整形」は、文字列を「ちょうど N 文字」にそろえる」ユーティリティです。
足りなければ埋める、長ければ切る——これを毎回バラバラに書くのではなく、ルール化して 1 箇所にまとめます。
例えば、こんなイメージです。
toFixedLength("ABC", 5); // "ABC "(右側をスペース埋め)
toFixedLength("123", 5, { padChar: "0" }); // "12300"
toFixedLength("ABCDEFG", 5); // "ABCDE"(長い分は切り捨て)
JavaScript固定長ファイル、レガシー連携、帳票出力など、「桁がずれると死ぬ」世界では必須のユーティリティです。
固定長整形の基本ルールを整理する
固定長整形は、実は次の 3 つを決めるだけです。
何文字にそろえるか(長さ)。
足りないとき、何で埋めるか(埋め文字)。
どちら側に埋めるか(左埋めか右埋めか)。
そして、「長すぎるときはどうするか」も決めます。
多くの業務では「超えた分は切り捨て」が基本です。
一番基本の固定長整形関数
右側スペース埋め+超過分切り捨て
まずは、固定長ファイルでよくある「右側スペース埋め」の版を作ります。
function toFixedLength(value, length, options = {}) {
const { padChar = " ", padSide = "right" } = options;
if (value == null) {
return " ".repeat(length);
}
let str = String(value);
if (str.length > length) {
str = str.slice(0, length);
}
if (str.length === length) {
return str;
}
const padCount = length - str.length;
const pad = padChar.repeat(padCount);
if (padSide === "left") {
return pad + str;
} else {
return str + pad;
}
}
JavaScript重要なポイントをかみ砕いて説明する
null や undefined の扱いを決める
if (value == null) {
return " ".repeat(length);
}
JavaScript固定長ファイルでは、「値がないときはスペースで埋める」というルールがよくあります。
ここではその前提で、null や undefined のときは「全部スペース」の固定長文字列を返すようにしています。
プロジェクトによっては "0" 埋めにしたいなどもあるので、ここはチームで決めて構いません。
まずは文字列に変換する
let str = String(value);
JavaScript数値でも、日付でも、とりあえず文字列にしてしまえば「長さ」で扱えます。
固定長整形は「見た目の文字列」を作る処理なので、最初に文字列化するのが基本です。
長すぎる場合は切り捨てる
if (str.length > length) {
str = str.slice(0, length);
}
JavaScript固定長の世界では、「長さを超えた分は切り捨て」がほぼデフォルトです。
ここで先に切っておくことで、「この先は必ず length 以下」という前提で考えられます。
足りない分だけ埋め文字を作る
const padCount = length - str.length;
const pad = padChar.repeat(padCount);
JavaScriptpadChar はデフォルト " "(スペース)ですが、オプションで "0" や "*" に変えることもできます。repeat で「埋め文字を必要な数だけ並べた文字列」を作っています。
左埋めか右埋めかを切り替える
if (padSide === "left") {
return pad + str;
} else {
return str + pad;
}
JavaScript文字列の左側に埋めるか、右側に埋めるかを padSide で切り替えています。
右埋め(左側に埋める)は、数値やコードでよく使います。
左埋め(右側に埋める)は、名前や住所など「左寄せ表示」に使います。
実際の動きを例で確認する
toFixedLength("ABC", 5);
// "ABC "(右側スペース埋め)
toFixedLength("ABC", 5, { padChar: "0" });
// "ABC00"
toFixedLength("123", 5, { padChar: "0", padSide: "left" });
// "00123"
toFixedLength("ABCDEFG", 5);
// "ABCDE"(超過分切り捨て)
toFixedLength(null, 4);
// " "(全部スペース)
JavaScript「長さを超えたら切る」「足りなければ埋める」「どちら側に埋めるか選べる」という動きになっているのが分かると思います。
数値+ゼロ埋め+固定長を組み合わせる
数値を固定長ゼロ埋めにする
数値コードや ID では、「左側ゼロ埋め+固定長」が定番です。
さっきの関数をそのまま使ってもいいですが、用途がはっきりしているならラッパーを作ると読みやすくなります。
function toFixedLengthNumber(value, length) {
return toFixedLength(value, length, { padChar: "0", padSide: "left" });
}
JavaScript使い方はこんな感じです。
toFixedLengthNumber(1, 4); // "0001"
toFixedLengthNumber(123, 4); // "0123"
toFixedLengthNumber(12345, 4); // "1234"(超過分切り捨て)
JavaScript「これは数値コード用だな」と一目で分かる名前にしておくと、後から読んだときに意図が伝わりやすくなります。
固定長ファイルを意識した使い方
項目ごとに長さを決めておく
固定長ファイルでは、項目ごとに「長さ」と「埋め方」が決まっています。
例えば、こんなイメージです。
- 1–10 桁目:伝票番号(10 桁、左ゼロ埋め)
- 11–30 桁目:顧客名(20 桁、右スペース埋め)
- 31–40 桁目:金額(10 桁、左ゼロ埋め)
これをコードに落とすと、次のようになります。
function buildRecord(orderNo, customerName, amount) {
const partOrderNo = toFixedLengthNumber(orderNo, 10);
const partCustomer = toFixedLength(customerName, 20); // デフォルト右スペース埋め
const partAmount = toFixedLengthNumber(amount, 10);
return partOrderNo + partCustomer + partAmount;
}
JavaScriptこうしておけば、「どの項目が何桁か」「どう埋めるか」がコード上にもはっきり残ります。
設計として意識してほしいこと
一つ目は、「固定長整形は“最後の一歩”」ということです。
内部では普通の文字列や数値として扱い、
ファイル出力や外部連携の直前で toFixedLength を通して固定長にする、という流れにしておくと、
途中の処理がシンプルになります。
二つ目は、「ルールを定数化する」ことです。
項目ごとの長さや埋め方を、コードのあちこちにベタ書きすると、必ずズレます。
export const FIELD_LENGTHS = {
orderNo: 10,
customerName: 20,
amount: 10,
};
JavaScriptのように定義しておき、toFixedLengthNumber(orderNo, FIELD_LENGTHS.orderNo) のように使うと、
「仕様変更で桁数が変わったとき」にも追従しやすくなります。
三つ目は、「切り捨てのリスクを意識する」ことです。
長すぎる値を切り捨てると、情報が失われます。
本当に切っていいのか、事前にバリデーションしてエラーにすべきなのか、
ユーティリティの責務とバリデーションの責務を分けて考える癖をつけておくと、事故が減ります。
少し手を動かして感覚をつかむ
コンソールで、次のようなコードを実際に打ってみてください。
toFixedLength("ABC", 5);
toFixedLength("ABC", 5, { padChar: "0" });
toFixedLength("123", 5, { padChar: "0", padSide: "left" });
toFixedLength("ABCDEFG", 5);
toFixedLength(null, 4);
toFixedLengthNumber(1, 4);
toFixedLengthNumber(123, 4);
toFixedLengthNumber(12345, 4);
JavaScript「どの値がどう整形されるか」「埋め文字と埋め方向がどう効いているか」を、自分の目で確認してみてください。
そのうえで、自分のプロジェクトに
export function toFixedLength(...) { ... }
export function toFixedLengthNumber(...) { ... }
JavaScriptを置いて、
「固定長にしたい」と思ったら、
生の padStart や padEnd ではなく、必ずこの“固定長整形ユーティリティ”を通す、というルールを作ってみてください。
その瞬間から、あなたの固定長処理は、
場当たり的な文字列操作から、意図と一貫性を備えた「業務レベルの固定長整形」に変わっていきます。
