Java Tips | 文字列処理:右寄せ

Java Java
スポンサーリンク

右寄せは「桁をそろえて“数字やコードを読みやすくする”」技

左寄せが「文字を左にそろえて見やすくする」技だとしたら、
右寄せは「数字や桁ものを右にそろえて、比較しやすくする」技です。

固定長ファイル、帳票、コンソール出力、ログなどで、
金額・数量・ID・連番などを右にそろえておくと、縦に並べたときに一気に読みやすくなります。

[ 123]
[ 100000]
[ 5]

人間の目は「右端をそろえた数字」を見たほうが、桁の違いを直感的に理解しやすいんですよね。


右寄せとパディングの関係を整理する

「右寄せ=左側パディング(多くはスペースかゼロ)」という発想

文字列の右寄せは、パディングの観点で見るとこう整理できます。

右寄せしたい
→ 右側はそのまま
→ 左側に「足りない分だけ」何かを埋める

つまり、「左パディング」です。
パディングの3要素で言うと、こうなります。

何を:対象の文字列(多くは数字やコード)
どちら側に:左側
何で:スペース ' ' か、ゼロ '0' など

数字を右寄せしたいときは、左側をスペースで埋めるか、ゼロで埋めるかを決めます。
固定長ファイルや帳票では、
「数値項目は右寄せ・左ゼロ埋め」や「右寄せ・左スペース埋め」といったルールがよく出てきます。


基本実装:左側スペース埋めで右寄せする

「見た目をそろえるための右寄せ」

まずは、指定した幅で右寄せする基本ユーティリティを作ります。
ここでは「左側スペース埋め=見た目をそろえる右寄せ」を実装します。

public final class Align {

    private Align() {}

    public static String right(String text, int width) {
        if (text == null) {
            text = "";
        }
        if (text.length() >= width) {
            return text;
        }
        StringBuilder sb = new StringBuilder(width);
        int padCount = width - text.length();
        for (int i = 0; i < padCount; i++) {
            sb.append(' ');
        }
        sb.append(text);
        return sb.toString();
    }
}
Java

使い方はこうなります。

System.out.println("[" + Align.right("123", 8) + "]");   // [     123]
System.out.println("[" + Align.right("5", 8) + "]");     // [       5]
System.out.println("[" + Align.right(null, 5) + "]");    // [     ]
System.out.println("[" + Align.right("とても長い", 4) + "]"); // [とても長い]
Java

ここで深掘りしたい重要ポイントは三つです。

一つ目は、「足りない分だけ左側にスペースを詰めている」ことです。
width - text.length() で必要なパディング数を計算し、その分だけスペースを先頭に追加しています。
これが「右寄せ」の正体です。

二つ目は、「null を空文字として扱っている」ことです。
null が来ても落ちずに、指定幅ぶんスペースだけの文字列を返します。
固定長ファイルや帳票では「空欄=スペース埋め」がよくあるので、この挙動は実務と相性がいいです。

三つ目は、「長すぎる場合はそのまま返している」ことです。
ここは要件次第で、「長すぎるときは左側を切る」「例外にする」などに変えても構いません。
大事なのは、「プロジェクトとしてどうするか」を決めて、ユーティリティにそのルールを閉じ込めることです。


ゼロ埋め右寄せ:数値項目の“ガチ業務仕様”

「右寄せ+左ゼロ埋め」で桁をそろえる

金額やIDなどの数値項目では、「右寄せ+左ゼロ埋め」がよく使われます。
これは見た目のためだけでなく、「固定桁で扱う」という意味も強いです。

public final class Align {

    private Align() {}

    public static String rightZero(String text, int width) {
        if (text == null) {
            text = "";
        }
        if (text.length() >= width) {
            return text;
        }
        StringBuilder sb = new StringBuilder(width);
        int padCount = width - text.length();
        for (int i = 0; i < padCount; i++) {
            sb.append('0');
        }
        sb.append(text);
        return sb.toString();
    }
}
Java

使い方はこうです。

System.out.println("[" + Align.rightZero("123", 8) + "]");   // [00000123]
System.out.println("[" + Align.rightZero("5", 8) + "]");     // [00000005]
System.out.println("[" + Align.rightZero(null, 5) + "]");    // [00000]
Java

ここでのポイントは、「右寄せの考え方はそのままに、“埋める文字”だけをスペースからゼロに変えている」ことです。
右寄せの本質は「左側パディング」なので、スペースかゼロかは用途の違いにすぎません。


例題:固定長ファイルで数値項目を右寄せする

「文字は左寄せ、数字は右寄せ」というお約束

固定長ファイルの仕様書には、よくこう書いてあります。

文字項目:左寄せ、右スペース埋め
数値項目:右寄せ、左ゼロ埋め

さっきの左寄せと組み合わせると、1レコードをこんなふうに組み立てられます。

public final class FixedRecord {

    private FixedRecord() {}

    public static String buildRecord(String customerId, String amount) {
        // 顧客ID:8桁、右寄せゼロ埋め
        String idPart = Align.rightZero(customerId, 8);
        // 金額:10桁、右寄せスペース埋め(ここでは文字列として扱う例)
        String amountPart = Align.right(amount, 10);
        return idPart + amountPart;
    }
}
Java

使い方はこうです。

String record = FixedRecord.buildRecord("123", "5000");
System.out.println("[" + record + "]");
System.out.println("length=" + record.length());
// [00000123      5000]
// length=18
Java

ここで深掘りしたいのは、「“右寄せ+何で埋めるか”というルールを、項目ごとにコードとして明示している」ことです。
Align.rightZero(customerId, 8) を見れば、「顧客IDは8桁ゼロ埋め右寄せなんだな」とすぐ分かります。
仕様書の一行を、そのままユーティリティ呼び出しとして表現するイメージです。


例題:コンソール出力やログで数字の桁をそろえる

右寄せで「数字の列」を読みやすくする

ログやコンソール出力で、数字を右寄せしておくと、
縦に並べたときに桁の違いが一目で分かります。

public final class LogNumbers {

    private LogNumbers() {}

    public static void printRow(String label, int value) {
        String l = Align.left(label, 10);          // 左寄せ(前回作ったものを使う想定)
        String v = Align.right(String.valueOf(value), 8); // 右寄せ
        System.out.println(l + " : " + v);
    }
}
Java

使い方はこうです。

LogNumbers.printRow("count", 5);
LogNumbers.printRow("count", 123);
LogNumbers.printRow("count", 10000);
Java

出力イメージはこんな感じです。

count      :        5
count      :      123
count      :    10000

ここでのポイントは、「ラベルは左寄せ、数字は右寄せにして“表っぽいログ”を作っている」ことです。
左寄せと右寄せを組み合わせることで、
人間がパッと見て理解しやすい出力を作れます。


例題:String.format との違いと使い分け

フォーマット指定子でも右寄せはできる

Java の String.format でも、右寄せは簡単に書けます。

String s1 = String.format("%8d", 123);   // [     123]
String s2 = String.format("%8s", "5");   // [       5]
System.out.println("[" + s1 + "]");
System.out.println("[" + s2 + "]");
Java

%8d%8s は「幅8、右寄せ」の意味です。

では、なぜ自前ユーティリティ Align.rightAlign.rightZero を用意するのか。

一つ目の理由は、「フォーマット文字列が読みにくくなりがち」だからです。
"%8d""%08d" に慣れていない人にとっては、意味が一瞬で分かりません。
Align.rightZero(id, 8) のほうが、「8桁ゼロ埋め右寄せなんだな」と直感的に伝わります。

二つ目の理由は、「業務ルールを“名前付き”で表現したい」からです。
固定長ファイルや帳票の仕様をフォーマット文字列に閉じ込めてしまうと、
あとから読んだときに「これは何桁で、右寄せなのか左寄せなのか」が分かりづらくなります。
Align.right(amount, 10) のように書いておけば、「10桁右寄せ」という情報がそのままコードに残ります。

String.format は複雑なフォーマットを一発でやりたいときに使い、
「右寄せだけ」「ゼロ埋めだけ」のような業務ルールはユーティリティにしておく――
そんな使い分けが現場ではしっくりきます。


まとめ:右寄せユーティリティで身につけたい感覚

右寄せは、「数字や桁ものを右端でそろえて、人間にも機械にも扱いやすくする」ためのテクニックであり、
実装としては「左側パディング(スペースかゼロ)」のシンプルな応用です。

押さえておきたい感覚は、まず「右寄せ=左側パディング」としてパディングの一種として捉えること。
次に、「スペース埋めかゼロ埋めかを用途ごとに決め、Align.rightAlign.rightZero のような“用途が分かる薄いラッパー”を用意する」こと。
そして、「固定長ファイル・帳票・ログ・コンソールなど、文脈ごとの“幅”と“寄せ方”を、メソッド呼び出しとしてコードに刻み、仕様書とコードのズレを減らす」ことです。

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