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

Java Java
スポンサーリンク

左寄せは「人間が読むために“左側をそろえる”」技

パディングの話で「左パディング」「右パディング」をやりましたが、
その中でも 左寄せ は「人間が読むときの見やすさ」に直結するテクニックです。

固定長ファイル、帳票、コンソール出力、ログなどで、
「文字は左に詰めて、余ったところをスペースで埋める」――これが左寄せです。

[山田 ]
[エラー ]
[OK ]

こうやって左側を揃えておくと、縦に並べたときに内容が一気に読みやすくなります。


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

「左寄せ=右側パディング(スペース埋め)」という発想

文字列の左寄せは、パディングの観点で見るととてもシンプルです。

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

つまり、「右パディング(スペース埋め)」そのものです。
パディングの3要素で言うと、こうなります。

何を:対象の文字列
どちら側に:右側
何で:スペース ' '

この「左寄せ=右側スペースパディング」という感覚を持っておくと、
実装も設計もスッと頭に入ってきます。


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

null や短すぎる・長すぎる場合の扱いも決めておく

まずは、指定した幅で左寄せする基本ユーティリティを作ります。

public final class Align {

    private Align() {}

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

使い方はこうなります。

System.out.println("[" + Align.left("山田", 8) + "]");   // [山田      ]
System.out.println("[" + Align.left("OK", 8) + "]");     // [OK      ]
System.out.println("[" + Align.left(null, 5) + "]");     // [     ]
System.out.println("[" + Align.left("とても長い名前", 4) + "]"); // [とても長い名前]
Java

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

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

二つ目は、「長さが足りないときだけスペースを追加している」ことです。
width - text.length() で足りない分を計算し、その数だけスペースを右側に詰めています。
これが「左寄せ」の正体です。

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


例題:固定長ファイルで文字項目を左寄せする

「文字は左寄せ、数字は右寄せ」という世界

固定長ファイルでは、よくこういうルールがあります。

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

このうち、文字項目の左寄せは、さきほどの Align.left がそのまま使えます。

public final class FixedTextField {

    private FixedTextField() {}

    public static String formatName(String name) {
        // 氏名は20桁、左寄せ(右スペース埋め)
        return Align.left(name, 20);
    }
}
Java

使い方はこうです。

String field = FixedTextField.formatName("山田太郎");
System.out.println("[" + field + "]");
System.out.println("length=" + field.length());
// [山田太郎              ]
// length=20
Java

ここでのポイントは、「“この項目は左寄せで何桁”という仕様を、ユーティリティ呼び出しとしてコードに刻んでいる」ことです。
仕様書に「氏名:20桁、左詰め」と書いてあるなら、
コード側には Align.left(name, 20) と書いておく――これが一番ズレにくい形です。


例題:コンソール出力やログで列をそろえる

左寄せで「表っぽいログ」を作る

ログやコンソール出力で、項目名やステータスを左寄せしておくと、
縦に並べたときに視認性がかなり上がります。

public final class LogTable {

    private LogTable() {}

    public static void printRow(String status, String message) {
        String s = Align.left(status, 10);
        System.out.println(s + " | " + message);
    }
}
Java

使い方はこうです。

LogTable.printRow("OK", "処理が完了しました");
LogTable.printRow("WARN", "入力値が不正です");
LogTable.printRow("ERROR", "DB接続に失敗しました");
Java

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

OK         | 処理が完了しました
WARN       | 入力値が不正です
ERROR      | DB接続に失敗しました

ここでのポイントは、「左寄せで“列の開始位置”をそろえている」ことです。
Align.left(status, 10) によって、どんな長さのステータスでも10文字分の幅を確保し、
そのあとに | やメッセージを続けることで、表のように見やすいログになります。


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

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

Java の String.format でも、左寄せは書けます。

String s = String.format("%-10s", "OK"); // 左寄せ、幅10、右スペース埋め
System.out.println("[" + s + "]");       // [OK        ]
Java

%-10s は「左寄せ、幅10、文字列」という意味です。

では、なぜ自前ユーティリティ Align.left を用意するのか。
理由は主に二つです。

一つ目は、「フォーマット文字列が読みにくい」からです。
"%-10s" に慣れていない人にとっては、意味が一瞬で分かりません。
Align.left(status, 10) のほうが、「ステータスを左寄せしているんだな」と直感的に伝わります。

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

String.format は一発で複雑なフォーマットをするときに便利で、
「左寄せだけ」「右寄せだけ」のような単機能は、ユーティリティメソッドにしておく――
そんな使い分けが現場ではしっくりきます。


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

左寄せは、「人間が読むときに左側をそろえて、見やすくする」ためのテクニックであり、
実装としては「右側スペースパディング」のシンプルな応用です。

押さえておきたい感覚は、まず「左寄せ=右側スペース埋め」としてパディングの一種として捉えること。
次に、「null や長すぎる文字列の扱いをプロジェクトとして決め、そのルールを Align.left のようなユーティリティに閉じ込める」こと。
そして、「固定長ファイル・帳票・ログ・コンソールなど、文脈ごとの“幅”と“寄せ方”を、メソッド呼び出しとしてコードに刻む」ことです。

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