概要

帳票出力や固定長ファイル連携では、数値のゼロ埋めや文字列の右揃え・左揃えが頻繁に必要になります。また、フォーム入力や CSV 取込では前後の空白を除去するトリム処理が欠かせません。Java には String.format によるパディングと trim / strip によるトリムが用意されていますが、trim が全角スペースを除去しないことを知らないまま本番障害に至るケースは珍しくありません。この記事では、業務でよく使うパディングパターン(ゼロ埋め、右揃え、固定長レコード)とトリム処理(trim / strip / stripLeading / stripTrailing)を整理し、Java 8 と Java 11 以降の動作の違い、全角スペースへの対処法も含めて解説します。

使いどころ

請求書番号を8桁ゼロ埋め(例: 42 → 00000042)して採番テーブルや帳票に出力する

銀行の全銀フォーマットや固定長ファイルで、氏名を全角20文字の左揃え・金額を右揃えで出力する

CSV 取込時にセルの前後に混入した半角・全角スペースを strip で除去し、DB 格納前にデータを正規化する

コード例

PaddingTrimUtil.java
public class PaddingTrimUtil {

    /** 数値を指定桁数でゼロ埋め */
    public static String zeroPad(int number, int width) {
        return String.format("%0" + width + "d", number);
    }

    /** 文字列を指定幅で右揃え(左スペース埋め) */
    public static String rightAlign(String text, int width) {
        return String.format("%" + width + "s", text);
    }

    /** 文字列を指定幅で左揃え(右スペース埋め) */
    public static String leftAlign(String text, int width) {
        return String.format("%-" + width + "s", text);
    }

    /** 固定長レコードの組み立て(帳票・バッチ向け) */
    public static String buildFixedRecord(String name, int price) {
        return String.format("%-10s%10d円", name, price);
    }

    /** Unicode 対応トリム(全角スペースも除去) */
    public static String safeTrim(String input) {
        if (input == null) {
            return null;
        }
        return input.strip(); // Java 11+
    }

    /** 先頭のみトリム */
    public static String trimLeading(String input) {
        if (input == null) {
            return null;
        }
        return input.stripLeading(); // Java 11+
    }

    public static void main(String[] args) {
        // ゼロ埋め
        System.out.println(zeroPad(42, 5));        // 00042
        System.out.println(zeroPad(42, 8));        // 00000042

        // 揃え
        System.out.println("[" + rightAlign("Java", 10) + "]");  // [      Java]
        System.out.println("[" + leftAlign("Java", 10) + "]");   // [Java      ]

        // 固定長レコード
        System.out.println("[" + buildFixedRecord("りんご", 1500) + "]");

        // トリム
        System.out.println("[" + safeTrim("\u3000Java\u3000") + "]"); // [Java]
        System.out.println("[" + safeTrim("  Hello  ") + "]");          // [Hello]

        // strip vs trim
        String fullWidthSpace = "\u3000データ\u3000";
        System.out.println("trim:  [" + fullWidthSpace.trim() + "]");   // 全角残る
        System.out.println("strip: [" + fullWidthSpace.strip() + "]");  // 全角も除去
    }
}

Java 8 / 17 / 21 の完全なサンプルコードは GitHub リポジトリ で確認できます。

Version Coverage

strip() / stripLeading() / stripTrailing() で Unicode 空白を一括除去できる。repeat() で任意文字のパディングも簡潔に書ける。

Java 17
// Java 17: strip() で全角スペースも除去
String input = "\u3000Java\u3000";
String trimmed = input.strip(); // "Java"
// repeat() でゼロ埋め
String num = "42";
String padded = "0".repeat(5 - num.length()) + num; // 00042

Library Comparison

標準 API(String.format / strip)ゼロ埋め・固定長パディング・空白除去の基本的な用途。外部依存なしで対応したいとき。全角文字幅の計算は自前で行う必要がある。固定長ファイルのバイト数制御には追加の実装が必要。
Apache Commons Lang(StringUtils)leftPad / rightPad / center など、多様なパディングを頻繁に使う場面。依存追加のコストに見合うかは使用頻度による。String.format で事足りるなら不要。

注意点

trim() は ASCII 制御文字(コード 0x20 以下)しか除去しない。全角スペース(U+3000)を含む Unicode 空白は strip()(Java 11+)を使う

String.format("%05d", num) は int / long にしか使えない。文字列のゼロ埋めには String.format と組み合わせるか、repeat() で自前パディングする

日本語文字列を String.format("%10s") でパディングすると、全角1文字が幅1としてカウントされるため、固定長ファイルのバイト数と合わなくなる

stripLeading() / stripTrailing() は Java 11 以降でのみ使える。Java 8 環境では正規表現で代用する必要がある

FAQ

trim() と strip() はどちらを使うべきですか。

Java 11 以降であれば strip() を推奨します。trim() は全角スペースを除去できませんが、strip() は Unicode 基準で空白文字を判定するため、日本語データの処理で安全です。

固定長ファイルで全角文字の幅をどう扱いますか。

String.format のパディングは文字数ベースのため、バイト数で揃える場合は getBytes(charset).length でバイト数を計算し、不足分をスペースで埋める自前処理が必要です。

repeat() が使えない Java 8 でのパディング方法は。

String.format("%05d", num) でゼロ埋めできます。文字列のパディングは StringBuilder に insert(0, '0') を繰り返すか、char[] を Arrays.fill で初期化する方法があります。

関連書籍

この記事のテーマをさらに深く学びたい方へ。

※ Amazon アソシエイトリンクを含みます