From 775b748800430071e06f136ad0dec9ea3aabe630 Mon Sep 17 00:00:00 2001 From: sumaiazaman Date: Fri, 17 Apr 2026 14:38:19 +0600 Subject: [PATCH] [13.x] Cast numeric values to string before preg_match in decimal, max_digits, and min_digits rules Co-Authored-By: Sumaiya Zaman --- .../Concerns/ValidatesAttributes.php | 6 +++--- tests/Validation/ValidationValidatorTest.php | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php index 35492c65b6e6..ae610385437b 100644 --- a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php +++ b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php @@ -673,7 +673,7 @@ public function validateDecimal($attribute, $value, $parameters) $matches = []; - if (preg_match('/^[+-]?\d*\.?(\d*)$/', $value, $matches) !== 1) { + if (preg_match('/^[+-]?\d*\.?(\d*)$/', (string) $value, $matches) !== 1) { return false; } @@ -1699,7 +1699,7 @@ public function validateMaxDigits($attribute, $value, $parameters) $length = strlen((string) $value); - return ! preg_match('/[^0-9]/', $value) && $length <= $parameters[0]; + return ! preg_match('/[^0-9]/', (string) $value) && $length <= $parameters[0]; } /** @@ -1809,7 +1809,7 @@ public function validateMinDigits($attribute, $value, $parameters) $length = strlen((string) $value); - return ! preg_match('/[^0-9]/', $value) && $length >= $parameters[0]; + return ! preg_match('/[^0-9]/', (string) $value) && $length >= $parameters[0]; } /** diff --git a/tests/Validation/ValidationValidatorTest.php b/tests/Validation/ValidationValidatorTest.php index a862b522f24d..b781c449fc1a 100755 --- a/tests/Validation/ValidationValidatorTest.php +++ b/tests/Validation/ValidationValidatorTest.php @@ -3256,6 +3256,12 @@ public function testValidateMaxDigitsDoesNotThrowOnNonStringValue() $trans = $this->getIlluminateArrayTranslator(); $v = new Validator($trans, ['x' => ['array']], ['x' => 'max_digits:5']); $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['x' => 123], ['x' => 'max_digits:5']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['x' => 123456], ['x' => 'max_digits:5']); + $this->assertFalse($v->passes()); } public function testValidateMinDigitsDoesNotThrowOnNonStringValue() @@ -3263,6 +3269,12 @@ public function testValidateMinDigitsDoesNotThrowOnNonStringValue() $trans = $this->getIlluminateArrayTranslator(); $v = new Validator($trans, ['x' => ['array']], ['x' => 'min_digits:1']); $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['x' => 123], ['x' => 'min_digits:2']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['x' => 1], ['x' => 'min_digits:2']); + $this->assertFalse($v->passes()); } public function testValidateDoesntStartWith() @@ -3718,6 +3730,12 @@ public function testValidateDecimal() $this->assertTrue($v->passes()); $v = new Validator($trans, ['foo' => '123.34'], ['foo' => 'Decimal:0,2']); $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => 123], ['foo' => 'Decimal:0']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => 1.23], ['foo' => 'Decimal:0,3']); + $this->assertTrue($v->passes()); } public function testValidateInt()