JavaScript Tips | 文字列ユーティリティ:業務用 - 固定長整形

JavaScript JavaScript
スポンサーリンク

何をしたいユーティリティか:「固定長整形」

ここでの「固定長整形」は、文字列を「ちょうど 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

固定長ファイルでは、「値がないときはスペースで埋める」というルールがよくあります。
ここではその前提で、nullundefined のときは「全部スペース」の固定長文字列を返すようにしています。

プロジェクトによっては "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);
JavaScript

padChar はデフォルト " "(スペース)ですが、オプションで "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

を置いて、

「固定長にしたい」と思ったら、
生の padStartpadEnd ではなく、必ずこの“固定長整形ユーティリティ”を通す、というルールを作ってみてください。

その瞬間から、あなたの固定長処理は、
場当たり的な文字列操作から、意図と一貫性を備えた「業務レベルの固定長整形」に変わっていきます。

タイトルとURLをコピーしました