読み込み中...

Javaで桁数チェックを完璧に理解する5ステップ|プログラミング実践

Javaプログラミング言語を使用した桁数チェックの詳細ガイドとサンプルコード Java
この記事は約9分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Javaの桁数チェックは、入力値を保存や計算に回す前に、文字数や数字の桁が想定範囲に収まるかを判定する処理です。結論から言えば、固定長ならlength()、数字だけを許すならPattern、業務ルールを共通化するならメソッド化やBean Validationを選ぶと整理しやすくなります。

動作確認環境
  • Java 21 LTS / OpenJDK 21
  • Spring Framework 6系を想定する例では Jakarta Bean Validation 3.0 系の名前空間を使用

そのため、初心者が最初に押さえる範囲は広くありません。Stringの長さ、nullの扱い、数値を文字列として扱う場面、正規表現の境界指定を理解できれば、日常的なプログラミングの入力チェックに対応できます。

📖 この記事で学べること
  • Javaで桁数チェックを行う基本方針
  • length()と正規表現の使い分け
  • フォームやデータベース登録前の入力チェック
  • 安全なコーディングとエラー表示の考え方
  • 独自ルールやフレームワークでのカスタマイズ方法

実際、桁数チェックは学習用の小さな例と業務アプリで見える課題が少し違いるのが基本です。学習段階ではifelseで分岐を理解し、業務アプリでは入力元、保存先、エラーメッセージ、テストケースを同じルールでつなげます。

その違いを意識すると、サンプルコードの読み方も変わります。単に期待される出力を確認するだけでなく、inputを空文字、上限ちょうど、上限超過、数字以外に変えたときの分岐を考えると、Javaの条件式が実用に近づきますし、ここがポイントです。

公式仕様の確認には、文字列処理ならJava SE 21 String API、正規表現ならJava SE 21 Pattern APIが一次情報になります。関連するJavaの基礎は、Java List型完全ガイドJavaエスケープ処理の解説も合わせて確認すると、コーディング時の判断がつながります。

桁数チェックの基本

桁数チェックの基本は、入力された値を「文字列として数えるのか」「数値として扱うのか」を先に決めることです。電話番号、郵便番号、会員番号のように先頭の0を保持したい値は、数値型ではなくStringとして扱うのが一般的になるのが目安です。

一般に、桁という言葉は数値の桁数を連想させますが、入力チェックでは文字列長として扱う場面が多くなります。会員番号や注文番号は見た目が数字でも計算しない値なので、Stringで保持して検証する設計が扱いやすくなります。

これを誤ると、09012345678の先頭ゼロが消えたり、数値変換時に例外が出たりするのがポイントです。そのため、Javaのプログラミングでは「計算する値」と「識別する値」を分け、識別子に近い値は文字列の桁数チェックで守る考え方が実用的です。

対象主な判定使うAPI注意点
電話番号固定長または範囲length()先頭ゼロを保持します
郵便番号数字7桁matches()ハイフン有無を決めます
パスワード最小長と最大長Pattern文字種チェックも併用します
DB登録名列定義の範囲booleanメソッド保存前に検証します
フォーム入力画面制約とサーバー制約@Sizeサーバー側でも判定します
数値コード数字のみd数値型変換だけに頼りません

桁数チェックの重要性

桁数チェックが担う役割は、入力の誤りを早い段階で止め、保存先や後続処理に合わない値を流さないことです。たとえばデータベースのVARCHAR(10)に11文字を入れようとすると、保存エラーや切り捨ての原因になります。

具体的には、郵便番号を7桁で保存する仕様なのに6桁を通してしまうと、後続の住所検索APIが期待した形式を受け取れません。逆に8桁以上を許すと、画面表示や帳票のレイアウトが崩れる可能性もあります。

その問題は画面の使いにくさだけでなく、ログの肥大化や例外処理の増加にもつながりますが、これは押さえたい点です。初心者がつまずきやすいのは、画面側の入力制限だけで十分と考えてしまう点で、サーバー側のJavaでも同じ条件を検証する必要があります。

💡 Tips: HTMLのmaxlengthは利用者の入力を助けますが、通信内容を完全に保証する仕組みではありません。Java側の桁数チェックを最終防衛として置くと、フォーム改変やAPI直送にも対応しやすくなります。

Javaにおける桁数チェックの基本的な手法

Javaで最も小さく始めるなら、input.length()で文字数を取得し、maxLength以下かどうかをifで判定するのが一般的です。このサンプルコードは固定の上限だけを見るため、初心者でも処理の流れを追いやすい構成です。

public class KetasuCheck {
    public static void main(String[] args) {
        String input = "12345";
        int maxLength = 5;
        if (input.length() <= maxLength) {
            System.out.println("入力されたデータは適切な桁数です");
        } else {
            System.out.println("入力されたデータは桁数オーバーです");
        }
    }
}

結果: 期待される出力は「入力されたデータは適切な桁数です」です。Stringlength()は文字数を返すため、半角数字だけでなく日本語文字列にも同じ形で使えます。

この小さな例では上限だけを扱っていますが、実際の入力チェックでは下限も同時に決めることが多くなります。空文字を許さないならinput.length() >= 1を条件に含め、任意項目なら空文字だけ別扱いにする設計が必要です。

ただし、length()は「数字かどうか」までは判定しません。そのため、桁数チェックと数字チェックを同時に満たしたい場合は、正規表現や文字種判定を組み合わせる必要があるのが現実的です。

桁数チェックの具体的な方法

具体的な方法は、固定長、最小最大の範囲、正規表現の三系統に分けると理解しやすくなります。Javaのコーディングでは、条件が単純ならlength()、数字だけなどのパターンがあるならmatches()Pattern.compile()を使う判断になります。

使い分けると、length()は条件が読みやすく、正規表現は数字や記号を同時に制限しやすいという違いがあると整理できます。どちらが常に優れているわけではなく、読み手が条件をすぐ理解できる書き方を選ぶのが現実的です。

一方、入力がnullになる可能性がある場面では、先にstr != nullを確認します。これを省くとNullPointerExceptionが発生するため、共通メソッドではnullを不正値として扱う設計が安定します。

サンプルコード1:基本的な桁数チェック

電話番号のように「11桁であること」を見るだけなら、phoneNumber.length() == 11という条件で十分です。プログラミング学習の初期段階では、この固定長判定から始めると分岐の意味を確認しやすくなると理解できます。

public class DigitCheck {
    public static void main(String[] args) {
        String phoneNumber = "09012345678";
        if (phoneNumber.length() == 11) {
            System.out.println("正しい桁数です。");
        } else {
            System.out.println("桁数が正しくありません。");
        }
    }
}

結果: 期待される出力は「正しい桁数です。」です。phoneNumberを10桁や12桁に変えると、期待される出力は「桁数が正しくありません。」に切り替わります。

その判断は、電話番号以外にも当てはまります。社員番号、商品コード、口座番号の一部などは、数字だけで構成されていても四則演算の対象ではないため、Javaのプログラミングでは文字列として扱うほうが仕様を保ちやすくなると覚えるとよいでしょう。

サンプルコード2:カスタム桁数チェック

最小桁数と最大桁数を引数にすると、同じ判定を複数箇所で使い回せます。サンプルコードではcheckStringLengthminmaxを渡し、範囲内ならtrueを返します。

public class CustomLengthCheck {
    public static void main(String[] args) {
        String input = "HelloJavaWorld";
        if (checkStringLength(input, 10, 20)) {
            System.out.println("入力された文字列は指定された範囲内の桁数です");
        } else {
            System.out.println("入力された文字列は指定された範囲外の桁数です");
        }
    }
    public static boolean checkStringLength(String str, int min, int max) {
        if (str != null && str.length() >= min && str.length() <= max) {
            return true;
        }
        return false;
    }
}

結果: 期待される出力は「入力された文字列は指定された範囲内の桁数です」です。HelloJavaWorldは14文字として扱われ、10以上20以下の範囲に入ります。

その実装では、str != nullを条件の先頭に置くことで、str.length()を呼ぶ前に不正な参照を止めています。初心者向けのサンプルコードでも、この順序を守ると例外に悩まされにくくなると考えられます。

サンプルコード3:正規表現を利用した桁数チェック

数字だけを許可しつつ桁数も見たい場合、正規表現を使うと条件を一つのパターンにできます。Javaではjava.util.regex.PatternMatcherを使い、^で先頭、$で末尾を固定します。

これにより、d{1,5}は1桁から5桁の数字だけに一致すると言えるでしょう。ただし、記号や空白も許したい場合は別のパターンが必要になり、業務ルールに合わせたカスタマイズ方法を選ぶことになります。

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DigitsChecker {
    public static void main(String[] args) {
        String input = "12345";
        int minDigits = 1;
        int maxDigits = 5;
        Pattern pattern = Pattern.compile("^\d{" + minDigits + "," + maxDigits + "}$");
        Matcher matcher = pattern.matcher(input);
        if (matcher.find()) {
            System.out.println("桁数は正しいです");
        } else {
            System.out.println("桁数が正しくありません");
        }
    }
}

結果: 期待される出力は「桁数は正しいです」です。input12345で、minDigitsからmaxDigitsまでの範囲に収まるためです。

一方、matcher.find()は一致する部分を探すAPIですが、パターン側で^$を使って全体一致に近い形にしています。全体一致を明示したい場合はmatcher.matches()を使う選択肢もあります。

if (matcher.find()) {
    System.out.println("桁数は正しいです");
} else {
    System.out.println("桁数が正しくありません。入力された桁数:" + input.length());
}

結果: 範囲外の入力なら、期待される出力に入力された桁数が含まれますし、これが一つの目安です。たとえば6桁の数字なら「入力された桁数:6」のように原因を利用者へ返せます。

ただし、エラーメッセージに入力値そのものを出すと、ログや画面に不要な情報が残る場合があります。そのため、フォーム画面では「桁数」を示し、個人情報に近い値は直接表示しない設計が適しているのが基本です。

桁数チェックの応用例

応用例では、フォーム入力とデータベース登録前のチェックが中心になります。Javaの桁数チェックは単体の条件式で終わらせるより、入力値を受け取る境界で使うと効果が出やすくなります。

その境界とは、Webフォーム、REST API、CSV取込、管理画面の編集フォームなどです。いずれも利用者や外部システムから値が来るため、プログラミング上の想定と異なる入力を受ける前提でコーディングするのが目安です。

応用例1:フォームバリデーション

フォームバリデーションでは、画面側の入力制限とサーバー側の桁数チェックを組み合わせます。画面のmaxlengthは入力補助として働きますが、Java側の検証は保存前の保証として別に置きます。

具体的には、氏名、ニックネーム、問い合わせ件名などで最大文字数を決め、超過時は短いエラーメッセージを返するのがポイントです。初心者が実装するときは、画面の見た目より先にサーバーの判定条件を固定すると迷いにくくなります。

サンプルコード4:フォームの桁数チェック

このサンプルコードは、フォーム入力を表すinputが10文字を超えるかどうかを判定します。実際のWebアプリではrequestやDTOから値を受け取りますが、判定式の考え方は同じです。

public class FormValidation {
    public static void main(String[] args) {
        String input = "こんにちは";
        if(input.length() > 10) {
            System.out.println("入力文字数が多すぎますが、覚えておくと役立つでしょう。最大10文字までです。");
        } else {
            System.out.println("入力受け付けました");
        }
    }
}

結果: 期待される出力は「入力受け付けました」です。こんにちはは5文字として扱われ、最大10文字の条件を超えません。

このとき、全角文字を含む日本語でもlength()はJavaのchar単位に基づく長さを返します。絵文字や一部の結合文字を厳密に数える要件では、単純な文字数と表示上の文字数がずれる場合があります。

⚠️ 注意: パスワード、氏名、住所などの入力では、桁数チェックだけで安全性や正確性は保証できません。文字種、禁止文字、正規化、保存先の列長も合わせて設計するのが一般的です。

応用例2:データベースの入力チェック

データベース登録前の桁数チェックでは、Java側の上限とテーブル定義の上限を合わせます。列がVARCHAR(10)なら、アプリケーションのmaxLengthも10に寄せると、保存直前のエラーを減らせます。

一方、画面には短めの制限を出し、内部処理では余裕を持たせる設計もあるのが現実的です。その場合でも、仕様書やDTOの定数に根拠を残し、Javaアノテーションの使い方と組み合わせると条件を追跡しやすくなります。

サンプルコード5:データベースの桁数制限とチェック

保存前に共通メソッドを通すと、複数の登録処理で同じルールを使えます。サンプルコードではisValidLengthminLengthmaxLengthを受け取り、範囲内ならtrueを返すると整理できます。

public class DatabaseInputCheck {
    public static boolean isValidLength(String input, int minLength, int maxLength) {
        if (input == null) {
            return false;
        }
        int inputLength = input.length();
        return inputLength >= minLength && inputLength <= maxLength;
    }
    public static void main(String[] args) {
        String userInput = "テストデータ";
        if (isValidLength(userInput, 1, 10)) {
            System.out.println("有効な入力です。");
        } else {
            System.out.println("無効な入力です。");
        }
    }
}

結果: 期待される出力は「有効な入力です。」です。userInputの文字数が1以上10以下に収まるため、保存可能な入力として扱われます。

この方法では、SQL発行前に不正な値を戻せます。ただし、最終的な整合性はデータベース制約でも守る必要があり、Java側の桁数チェックだけに責任を寄せない構成が望まれますし、ここを基本と考えるとよいでしょう。

注意点と対処法

注意点は、性能、セキュリティ、保守性の三方向から考えると整理できます。桁数チェックは軽い処理に見えますが、入力経路が多いシステムでは同じ条件が散らばりやすく、後から仕様変更が入りにくくなります。

そのため、単純なサンプルコードを理解した後は、どこに判定を置くかを決める段階に進みますし、ここがポイントです。サービス層、DTO、Controller、エンティティ直前など、配置ごとの責務を分けるとコーディングの一貫性が保てます。

注意点1:性能への影響

単体のlength()判定は軽量ですが、正規表現の生成を大量ループ内で繰り返すと無駄が増えます。特に同じパターンを何度も使う場合は、Patternを使い回す設計が考えられますが、これは押さえたい点です。

ただし、性能を理由に可読性を大きく落とす必要はありません。一般的な入力フォームでは、正しさと保守性を優先し、処理件数が多いバッチやCSV取込では重複チェックの削減を検討します。

public boolean isValidLength(String input, int minLength, int maxLength) {
    int length = input.length();
    return length >= minLength && length <= maxLength;
}

結果: inputnullでなく範囲内なら、期待される戻り値はtrueです。範囲外ならfalseになりますが、nullを渡すと例外になる点に注意します。

基本的に、共通メソッドは呼び出し側の負担を減らすために作りますし、これが一つの目安です。毎回null確認を呼び出し元へ求めると漏れが起きやすいため、入力チェック用メソッドではnullを受けてもfalseを返す設計が扱いやすくなります。

注意点2:セキュリティ面での考慮

桁数チェックは入力制限の一部であり、SQLインジェクションやXSSを単独で防ぐ仕組みではありません。長さが正しい攻撃文字列も存在するため、用途に応じてエスケープ、プレースホルダ、HTML出力時のエンコードを併用します。

これを理解すると、Javaのバリデーションは「長さ」「文字種」「意味」の層に分けられますが、覚えておくと役立つでしょう。たとえばうるう年判定のような条件分岐では意味の検証が中心になり、桁数チェックとは別の責務になります。

public boolean isSecureLength(String input) {
    return input.length() <= 100;
}

結果: inputが100文字以下なら、期待される戻り値はtrueです。ただし、この戻り値は長さだけの判定であり、安全な文字列であることまでは示しません。

そのため、SQLに渡す値はPreparedStatementのプレースホルダを使い、HTMLに出す値は出力先に合わせてエスケープします。桁数チェックを通過した値でも、保存や表示の直前で別の防御を置く構成が必要です。

対処法:最適なコーディングスタイルとは

読みやすい桁数チェックにするには、マジックナンバーを減らし、意図を表す名前を付けますし、ここを基本と考えるとよいでしょう。100を直接書くより、MAX_LENGTHUSER_NAME_MAX_LENGTHのような定数にすると、後から条件の意味を追いやすくなります。

同様に、戻り値だけで不十分な場合は、エラーコードやメッセージを返す設計も考えられます。単純な学習用サンプルコードではbooleanで足りますが、実務寄りのプログラミングでは「どの条件に失敗したか」を利用者に返す場面が増えますし、ここがポイントです。

public class LengthChecker {
    private static final int MAX_LENGTH = 100;
    public static boolean isValid(String input) {
        return input != null && input.length() <= MAX_LENGTH;
    }
    public static void main(String[] args) {
        String input = "Hello, World!";
        boolean result = isValid(input);
        System.out.println("The input is valid: " + result);
    }
}

結果: 期待される出力は「The input is valid: true」です。inputnullではなく、MAX_LENGTH以下のため有効と判定されます。

同様に、テストコードではMAX_LENGTHちょうどの値、MAX_LENGTH + 1の値、nullを用意すると境界の動きを確認しやすくなります。期待される戻り値を明確にしておけば、将来の修正で条件が崩れた場合にも検出できると理解できます。

ℹ️ 補足: JavaのString.length()はUnicodeコードポイント数ではなく、UTF-16のコードユニット数に基づきます。絵文字を含む入力で表示上の文字数を厳密に扱う場合は、codePointCount()なども検討します。

カスタマイズ方法

カスタマイズ方法は、独自メソッドで条件をまとめる方法と、フレームワークのバリデーションへ寄せる方法に分かれますが、これは押さえたい点です。小さなJavaプログラムではメソッド化が扱いやすく、Webアプリではアノテーションを使うほうがルールを見通しやすくなります。

ただし、どちらのカスタマイズ方法でも、入力値がnullの場合、空文字""の場合、空白だけの場合をどう扱うかを決める必要があります。桁数チェックの前にtrim()や正規化を行うかどうかも、仕様として明示しておくとズレを防げますし、これが一つの目安です。

カスタマイズ1:独自の桁数チェックルールの設定

独自ルールでは、最小値、最大値、空文字の許可、数字限定などを組み合わせます。コーディング時は、条件式を長くしすぎず、isValidのような名前で意味を隠蔽すると読みやすくなります。

具体的には、会員IDなら「8桁以上12桁以下の数字」、表示名なら「1文字以上20文字以下」のように対象ごとに変えますが、覚えておくと役立つでしょう。この柔軟さがカスタマイズ方法の中心になり、サンプルコードを自分の要件へ置き換える足場になります。

public class CustomLengthCheck {
    public static boolean isValid(String str, int min, int max) {
        if (str == null) {
            return false;
        }
        int length = str.length();
        return length >= min && length <= max;
    }
    public static void main(String[] args) {
        String testString = "HelloWorld";
        System.out.println(isValid(testString, 5, 10));
    }
}

結果: 期待される出力はtrueです。HelloWorldは10文字で、最小5文字以上かつ最大10文字以下の条件に収まります。

その延長として、戻り値をbooleanから独自の結果型へ変える方法もあります。たとえばVALIDTOO_SHORTTOO_LONGを返す設計にすると、画面側で適切なメッセージを出し分けられますし、ここを基本と考えるとよいでしょう。

カスタマイズ2:フレームワークを利用した桁数チェックのカスタマイズ

Spring Framework 6系やSpring Boot 3系では、Bean Validationの名前空間としてjakarta.validationを使う構成が一般的です。@SizeをDTOのフィールドやメソッド引数に付けると、桁数チェックのルールを宣言的に表せます。

一方、アノテーションを付けただけで任意のmainメソッド内の呼び出しが自動検証されるわけではありません。Spring管理下のControllerやService、またはValidatorを使う処理で検証される点を区別します。

import jakarta.validation.constraints.Size;
import org.springframework.validation.annotation.Validated;
@Validated
public class CustomValidationService {
    public boolean isValid(@Size(min = 5, max = 10) String str) {
        return str != null;
    }
    public static void main(String[] args) {
        CustomValidationService service = new CustomValidationService();
        String testString = "HelloWorld";
        System.out.println(service.isValid(testString));
    }
}

結果: このmainメソッドを通常のJavaアプリとして呼ぶだけなら、期待される出力はtrueです。@Sizeの検証はSpringのメソッドバリデーションなど、対応する仕組みを通した場合に働きます。

そのため、Springのサンプルコードを読むときは、アノテーションの種類だけでなく、検証を起動する仕組みも確認します。@Validated@ValidBindingResult、例外ハンドラの役割を分けると、桁数チェックの結果を画面やAPIレスポンスへ返しやすくなると覚えるとよいでしょう。

ちなみに、古い記事やサンプルではjavax.validation.constraints.Sizeが使われる場合があります。Spring Boot 3系を前提にするならjakarta.validation.constraints.Sizeへ読み替える必要があるため、依存関係とバージョンを確認してから採用します。

まとめ

Javaの桁数チェックは、Stringlength()で始め、必要に応じてPattern、共通メソッド、Bean Validationへ広げる流れで学ぶと理解しやすくなると考えられます。固定長、範囲指定、数字限定のどれを求めるかで、選ぶAPIが変わります。

その判断を誤らないためには、入力値を数値として扱うのか、識別子として文字列のまま扱うのかを先に決めます。電話番号や郵便番号のように先頭ゼロが意味を持つ値は、JavaでもStringとしてコーディングするのが自然です。

一方、桁数チェックだけではセキュリティ対策は完結しません。SQL、HTML、ログ、データベース制約の各地点で別の防御が必要になり、オーバーライドのようなJava設計の基礎と同じく、責務の分け方が読みやすさを左右すると言えるでしょう。

初心者が実践へ進むなら、サンプルコードをそのまま写すだけでなく、null、空文字、最大値超過、数字以外の入力を変えて期待される出力を確認する学習が効果的です。プログラミングでは条件の境界に不具合が集まりやすいため、境界値を意識したコーディングが身につくと応用しやすくなります。

桁数チェックのカスタマイズ方法まで整理できれば、フォーム、API、データベース登録前の検証を同じ考え方で扱えます。Javaの入力チェックは小さな条件式から始まりますが、システム全体のデータ品質を守る土台として設計する視点が欠かせません。

関連記事

著者: Japanシーモア編集部

Japanシーモアは、Web/IoT/APP/SYS 分野のプログラミング情報を体系的に提供するメディアです。本記事は編集部による執筆とAI支援を組み合わせて制作し、公開前に編集部が校正しています。誤りや改善案がございましたらお問い合わせよりご連絡ください。

※本記事は実在のエンジニア複数名で構成される Japanシーモア編集部が、AI支援を活用して作成・校正・公開しています。