From 5fffb9c411bb2161c99e2f3df63063296e2fce61 Mon Sep 17 00:00:00 2001 From: Pusparaj Date: Mon, 19 Dec 2022 22:10:07 +0545 Subject: [PATCH 1/2] Add `decimal` validation rule --- .../Concerns/ValidatesAttributes.php | 28 ++++++++++++++ tests/Validation/ValidationValidatorTest.php | 37 +++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php index 33ddd69fdccc..5e9034dca69f 100644 --- a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php +++ b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php @@ -554,6 +554,34 @@ public function validateDateEquals($attribute, $value, $parameters) return $this->compareDates($attribute, $value, $parameters, '='); } + /** + * Validate that an attribute has decimal figures between a set of values. + * + * @param string $attribute + * @param mixed $value + * @param array $parameters + * @return bool + */ + public function validateDecimal($attribute, $value, $parameters) + { + if (!$this->validateNumeric($attribute, $value)) { + return false; + } + + $this->requireParameterCount(1, $parameters, 'decimal'); + + $matches = []; + preg_match('/^\d*.(\d*)$/', $value, $matches); + + $decimals = strlen(end($matches)); + + if ($decimals < $parameters[0]) { + return false; + } + + return !isset($parameters[1]) || $decimals <= $parameters[1]; + } + /** * Validate that an attribute is different from another attribute. * diff --git a/tests/Validation/ValidationValidatorTest.php b/tests/Validation/ValidationValidatorTest.php index f73b8865ab0b..c914b39a0146 100755 --- a/tests/Validation/ValidationValidatorTest.php +++ b/tests/Validation/ValidationValidatorTest.php @@ -2448,6 +2448,43 @@ public function testValidateInteger() $this->assertTrue($v->passes()); } + public function testValidateDecimal() + { + $trans = $this->getIlluminateArrayTranslator(); + $v = new Validator($trans, ['foo' => 'asdad'], ['foo' => 'Decimal:2,3']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => '1.2345'], ['foo' => 'Decimal:2,3']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => '1.234'], ['foo' => 'Decimal:2,3']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => '1.23'], ['foo' => 'Decimal:2,3']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => '1.2'], ['foo' => 'Decimal:2,3']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => '1.234'], ['foo' => 'Decimal:2']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => '1.23'], ['foo' => 'Decimal:2']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => '1.2'], ['foo' => 'Decimal:2']); + $this->assertFalse($v->passes()); + + $v = new Validator($trans, ['foo' => '1'], ['foo' => 'Decimal:0,1']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => '1.2'], ['foo' => 'Decimal:0,1']); + $this->assertTrue($v->passes()); + + $v = new Validator($trans, ['foo' => '1.23'], ['foo' => 'Decimal:0,1']); + $this->assertFalse($v->passes()); + } + public function testValidateInt() { $trans = $this->getIlluminateArrayTranslator(); From 43719cc53a990d8b8d65c19d610f918f47a4d9a9 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Mon, 19 Dec 2022 11:20:41 -0600 Subject: [PATCH 2/2] formatting --- .../Validation/Concerns/ValidatesAttributes.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php index 5e9034dca69f..1aee29de42c7 100644 --- a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php +++ b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php @@ -555,7 +555,7 @@ public function validateDateEquals($attribute, $value, $parameters) } /** - * Validate that an attribute has decimal figures between a set of values. + * Validate that an attribute has a given number of decimal places. * * @param string $attribute * @param mixed $value @@ -571,15 +571,13 @@ public function validateDecimal($attribute, $value, $parameters) $this->requireParameterCount(1, $parameters, 'decimal'); $matches = []; + preg_match('/^\d*.(\d*)$/', $value, $matches); $decimals = strlen(end($matches)); - if ($decimals < $parameters[0]) { - return false; - } - - return !isset($parameters[1]) || $decimals <= $parameters[1]; + return $decimals >= $parameters[0] && + (! isset($parameters[1]) || $decimals <= $parameters[1]); } /**