Laravelの数値のバリデーションまとめ

Laravel バリデーションについてまとめていくよ2(文字種編)に続いてlaravelのバリデーションをまとめていきます。
今回は、数値についてのバリデーションを確認します。

確認するルールはintegerdigitsdigits_betweenmax_digitsmin_digitsnumericdecimalmultiple_ofです。

integer | 整数

整数であることをチェックします。
Laravle公式のバリデーションのドキュメントに下記のように(翻訳済みです)あります。

この検証ルールは入力がinteger型であることを検証するものではなく、PHPのFILTER_VALIDATE_INTルールが受け付ける型であることを検証するものです。入力が数値であることを検証する必要がある場合は、このルールとnumericのルールを組み合わせて使用してください。

https://laravel.com/docs/9.x/validation#rule-integer

16進、8進、2進表記、マイナスも許容されます。
プラスの10進表記の整数のみを許容したい場合は後述のdigitsなどがよいかもしれません。
マイナスの10進表記も許容したい場合は、正規表現で-?[0-9]+のようにしたほうが良いかもしれません。

PHP
$rules = ['parameter' => 'integer'];

// リクエストにパラメーターが含まれていない
$data = [];
Validator::make($data, $rules)->passes(); // true

// null
$data = ['parameter' => null];
Validator::make($data, $rules)->passes(); // false

// 空文字
$data = ['parameter' => ''];
Validator::make($data, $rules)->passes(); // true

// 半角スペース
$data = ['parameter' => ' '];
Validator::make($data, $rules)->passes(); // false

// 空配列
$data = ['parameter' => []];
Validator::make($data, $rules)->passes(); // false

// アルファベット
$data = ['parameter' => 'a'];
Validator::make($data, $rules)->passes(); // false

// 全角文字
$data = ['parameter' => "1234"];
Validator::make($data, $rules)->passes(); // false

// 文字列
$data = ['parameter' => '1234'];
Validator::make($data, $rules)->passes(); // true

// マイナス
$data = ['parameter' => '-1234'];
Validator::make($data, $rules)->passes(); // true

// ゼロ
$data = ['parameter' => '0'];
Validator::make($data, $rules)->passes(); // true

// 符号付
$data = ['parameter' => '+1234'];
Validator::make($data, $rules)->passes(); // true

// 8進表記
$data = ['parameter' => '0123'];
Validator::make($data, $rules)->passes(); // true

// 8進表記
$data = ['parameter' => '0o123'];
Validator::make($data, $rules)->passes(); // true

// 16進表記
$data = ['parameter' => '0x1A'];
Validator::make($data, $rules)->passes(); // true

// 2進表記
$data = ['parameter' => '0b11111111'];
Validator::make($data, $rules)->passes(); // true

// PHP 7.4.0 以降
$data = ['parameter' => '1_234_567'];
Validator::make($data, $rules)->passes(); // true

// 小数
$data = ['parameter' => '0.1234'];
Validator::make($data, $rules)->passes(); // false

// 小数
$data = ['parameter' => '-0.1234'];
Validator::make($data, $rules)->passes(); // false

// 小数
$data = ['parameter' => '+0.1234'];
Validator::make($data, $rules)->passes(); // false

// 指数表記
$data = ['parameter' => '1e8'];
Validator::make($data, $rules)->passes(); // false

サンプルでは数字については文字列で記載していますが、数値型でも同様の結果となります。

Laravelでの実装はこちら。

PHPでの整数の定義は下記のようになっています。

decimal     : [1-9][0-9]*(_[0-9]+)*
            | 0

hexadecimal : 0[xX][0-9a-fA-F]+(_[0-9a-fA-F]+)*

octal       : 0[oO]?[0-7]+(_[0-7]+)*

binary      : 0[bB][01]+(_[01]+)*

integer     : decimal
            | hexadecimal
            | octal
            | binary
https://www.php.net/manual/ja/language.types.integer.php

digits | 整数(桁数指定)

プラスの整数であり、指定の桁数であることをチェックします。
ゼロ始まりも許容されるので、注意が必要です。

PHP
$rules = ['parameter' => 'digits:4'];

// リクエストにパラメーターが含まれていない
$data = [];
Validator::make($data, $rules)->passes(); // true

// null
$data = ['parameter' => null];
Validator::make($data, $rules)->passes(); // false

// 空文字
$data = ['parameter' => ''];
Validator::make($data, $rules)->passes(); // true

// 半角スペース
$data = ['parameter' => ' '];
Validator::make($data, $rules)->passes(); // true

// 空配列
$data = ['parameter' => []];
Validator::make($data, $rules)->passes(); // Exception(エラーになります)

// アルファベット
$data = ['parameter' => 'a'];
Validator::make($data, $rules)->passes(); // false

// 全角文字
$data = ['parameter' => "1234"];
Validator::make($data, $rules)->passes(); // false

// 文字列
$data = ['parameter' => '1234'];
Validator::make($data, $rules)->passes(); // true

// 文字列
$data = ['parameter' => '123'];
Validator::make($data, $rules)->passes(); // false

// 文字列
$data = ['parameter' => '12345'];
Validator::make($data, $rules)->passes(); // false

// マイナス
$data = ['parameter' => '-1234'];
Validator::make($data, $rules)->passes(); // false

// ゼロ
$data = ['parameter' => '0'];
Validator::make($data, $rules)->passes(); // false

// 符号付
$data = ['parameter' => '+1234'];
Validator::make($data, $rules)->passes(); // false

// 8進表記
$data = ['parameter' => '0123'];
Validator::make($data, $rules)->passes(); // true

// 8進表記
$data = ['parameter' => '0o123'];
Validator::make($data, $rules)->passes(); // false

// 16進表記
$data = ['parameter' => '0x1A'];
Validator::make($data, $rules)->passes(); // false

// 2進表記
$data = ['parameter' => '0b11111111'];
Validator::make($data, $rules)->passes(); // false

// PHP 7.4.0 以降
$data = ['parameter' => '1_234_567'];
Validator::make($data, $rules)->passes(); // false

// 小数
$data = ['parameter' => '0.1234'];
Validator::make($data, $rules)->passes(); // false

// 小数
$data = ['parameter' => '-0.1234'];
Validator::make($data, $rules)->passes(); // false

// 小数
$data = ['parameter' => '+0.1234'];
Validator::make($data, $rules)->passes(); // false

// 指数表記
$data = ['parameter' => '1e8'];
Validator::make($data, $rules)->passes(); // false

Laravelでの実装はこちら。

digits_between | 整数(桁数範囲指定)

digitsの桁数の範囲を指定してチェックします。
サンプルは大幅に省略します。

PHP
$rules = ['parameter' => 'digits_between:2,4'];

$data = ['parameter' => '1'];
Validator::make($data, $rules)->passes(); // false

$data = ['parameter' => '12'];
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '123'];
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '1234'];
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '1235'];
Validator::make($data, $rules)->passes(); // false

Laravelでの実装はこちら。

max_digits | 整数(最大桁数指定)

digitsの最大桁数を指定してチェックします。
サンプルは大幅に省略します。

PHP
$rules = ['parameter' => 'max_digits:3'];

$data = ['parameter' => '1'];
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '12'];
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '123'];
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '1234'];
Validator::make($data, $rules)->passes(); // false

$data = ['parameter' => '1235'];
Validator::make($data, $rules)->passes(); // false

Laravelでの実装はこちら。

min_digits | 整数(最低桁数指定)

digitsの最低桁数を指定してチェックします。
サンプルは大幅に省略します。

PHP
$rules = ['parameter' => 'min_digits:3'];

$data = ['parameter' => '1'];
Validator::make($data, $rules)->passes(); // false

$data = ['parameter' => '12'];
Validator::make($data, $rules)->passes(); // false

$data = ['parameter' => '123'];
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '1234'];
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '1235'];
Validator::make($data, $rules)->passes(); // true

Laravelでの実装はこちら。

numeric | 数値

is_numeric関数で数値であるかをチェックします。

PHP
$rules = ['parameter' => 'integer'];

// リクエストにパラメーターが含まれていない
$data = [];
Validator::make($data, $rules)->passes(); // true

// null
$data = ['parameter' => null];
Validator::make($data, $rules)->passes(); // false

// 空文字
$data = ['parameter' => ''];
Validator::make($data, $rules)->passes(); // true

// 半角スペース
$data = ['parameter' => ' '];
Validator::make($data, $rules)->passes(); // true

// 空配列
$data = ['parameter' => []];
Validator::make($data, $rules)->passes(); // false

// アルファベット
$data = ['parameter' => 'a'];
Validator::make($data, $rules)->passes(); // false

// 全角文字
$data = ['parameter' => "1234"];
Validator::make($data, $rules)->passes(); // false

// 文字列
$data = ['parameter' => '1234'];
Validator::make($data, $rules)->passes(); // true

// マイナス
$data = ['parameter' => '-1234'];
Validator::make($data, $rules)->passes(); // true

// ゼロ
$data = ['parameter' => '0'];
Validator::make($data, $rules)->passes(); // true

// 符号付
$data = ['parameter' => '+1234'];
Validator::make($data, $rules)->passes(); // true

// 8進表記
$data = ['parameter' => '0123'];
Validator::make($data, $rules)->passes(); // true

// 8進表記
$data = ['parameter' => '0o123'];
Validator::make($data, $rules)->passes(); // false

// 16進表記
$data = ['parameter' => '0x1A'];
Validator::make($data, $rules)->passes(); // false

// 2進表記
$data = ['parameter' => '0b11111111'];
Validator::make($data, $rules)->passes(); // false

// PHP 7.4.0 以降
$data = ['parameter' => '1_234_567'];
Validator::make($data, $rules)->passes(); // false

// 小数
$data = ['parameter' => '0.1234'];
Validator::make($data, $rules)->passes(); // true

// 小数
$data = ['parameter' => '-0.1234'];
Validator::make($data, $rules)->passes(); // true

// 小数
$data = ['parameter' => '+0.1234'];
Validator::make($data, $rules)->passes(); // true

// 指数表記
$data = ['parameter' => '1e8'];
Validator::make($data, $rules)->passes(); // true

Laravelでの実装はこちら。

PHPでの数値形式の定義は下記のようになっています。

WHITESPACES      \s*
LNUM             [0-9]+
DNUM             ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM    (({LNUM} | {DNUM}) [eE][+-]? {LNUM})
INT_NUM_STRING   {WHITESPACES} [+-]? {LNUM} {WHITESPACES}
FLOAT_NUM_STRING {WHITESPACES} [+-]? ({DNUM} | {EXPONENT_DNUM}) {WHITESPACES}
NUM_STRING       ({INT_NUM_STRING} | {FLOAT_NUM_STRING})
https://www.php.net/manual/ja/language.types.numeric-strings.php

decimal | 数値(小数桁数指定)

上述のnumericルールにマッチし、小数点以下の桁数が指定桁数かのチェックをします。
引数を1つのみ指定した場合、小数点以下の桁数が一致することをチェックします。
引数を2つ指定した場合は、小数点以下の桁数の範囲を指定します。

引数を1つのみ指定した場合

PHP
$rules = ['parameter' => 'decimal:2'];

$data = ['parameter' => '1.2'];
Validator::make($data, $rules)->passes(); // false

$data = ['parameter' => '1.23'];
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '1.234'];
Validator::make($data, $rules)->passes(); // false

引数を2つ指定した場合

PHP
$rules = ['parameter' => 'decimal:2,3'];

$data = ['parameter' => '1.2'];
Validator::make($data, $rules)->passes(); // false

$data = ['parameter' => '1.23'];
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '1.234'];
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '1.2345'];
Validator::make($data, $rules)->passes(); // false

Laravelでの実装はこちら。

multiple_of | 倍数

入力値が指定された数値の倍数であるかをチェックする。
サンプルは3としましたが、0.3などの小数も設定できます。

PHP
$rules = ['parameter' => 'multiple_of:3'];

// リクエストにパラメーターが含まれていない
$data = [];
Validator::make($data, $rules)->passes(); // true

// null
$data = ['parameter' => null];
Validator::make($data, $rules)->passes(); // false

// 空文字
$data = ['parameter' => ''];
Validator::make($data, $rules)->passes(); // true

// 半角スペース
$data = ['parameter' => ' '];
Validator::make($data, $rules)->passes(); // true

// 空配列
$data = ['parameter' => []];
Validator::make($data, $rules)->passes(); // false

// 指数表記
$data = ['parameter' => '1e8'];
Validator::make($data, $rules)->passes(); // Exception(エラーになります)

// アルファベット
$data = ['parameter' => 'a'];
Validator::make($data, $rules)->passes(); // false

// 全角文字
$data = ['parameter' => "1234"];
Validator::make($data, $rules)->passes(); // false

// 文字列
// ゼロ
$data = ['parameter' => '0'];
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '1'];
Validator::make($data, $rules)->passes(); // false

$data = ['parameter' => '3'];
Validator::make($data, $rules)->passes(); // true

// マイナス
$data = ['parameter' => '-3'];
Validator::make($data, $rules)->passes(); // true

// 符号付
$data = ['parameter' => '+3'];
Validator::make($data, $rules)->passes(); // true

// 8進表記
$data = ['parameter' => 0123]; // 83
Validator::make($data, $rules)->passes(); // false

$data = ['parameter' => '0123']; // 123 として扱われる
Validator::make($data, $rules)->passes(); // true

$data = ['parameter' => '0o123'];
Validator::make($data, $rules)->passes(); // false

// 16進表記
$data = ['parameter' => '0x1A'];
Validator::make($data, $rules)->passes(); // false

// 2進表記
$data = ['parameter' => '0b11111111'];
Validator::make($data, $rules)->passes(); // false

// PHP 7.4.0 以降
$data = ['parameter' => '123_456'];
Validator::make($data, $rules)->passes(); // false

// 小数
$data = ['parameter' => '0.1234'];
Validator::make($data, $rules)->passes(); // false

// 数値
$data = ['parameter' => 2.99999999999999];
Validator::make($data, $rules)->passes(); // true

// 文字列
$data = ['parameter' => '2.99999999999999'];
Validator::make($data, $rules)->passes(); // false

Laravelでの実装はこちら。