diff --git a/src/Rules/ValidEvenNumber.php b/src/Rules/ValidEvenNumber.php index a8278e0..65ac402 100644 --- a/src/Rules/ValidEvenNumber.php +++ b/src/Rules/ValidEvenNumber.php @@ -11,7 +11,20 @@ class ValidEvenNumber implements Rule */ public function passes($attribute, $value): bool { - return preg_match('/^\d*[02468]$/', $value); + $number = strval($value); + $number = explode('.', $number); + + if (isset($number[1]) && $number[1] != 0) { + return false; + } + + $number = $number[0]; + + if (extension_loaded('gmp')) { + return gmp_cmp(gmp_mod($number, '2'), '0') === 0; + } + + return $number % 2 === 0; } /** diff --git a/tests/Rules/ValidEvenNumberTest.php b/tests/Rules/ValidEvenNumberTest.php index 0e2690b..b0a1bf8 100644 --- a/tests/Rules/ValidEvenNumberTest.php +++ b/tests/Rules/ValidEvenNumberTest.php @@ -30,4 +30,36 @@ public function test_check_number_is_not_even() $this->assertFalse($passes); } + + /** + * Test float number is even. + * + * @test + * + * @return void + */ + public function check_float_number_is_even() + { + $rules = ['even_number' => [new ValidEvenNumber]]; + $data = ['even_number' => '754.00']; + $passes = $this->app['validator']->make($data, $rules)->passes(); + + $this->assertTrue($passes); + } + + /** + * Test float number is not even. + * + * @test + * + * @return void + */ + public function check_float_number_is_not_even() + { + $rules = ['even_number' => [new ValidEvenNumber]]; + $data = ['even_number' => '333.13']; + $passes = $this->app['validator']->make($data, $rules)->passes(); + + $this->assertFalse($passes); + } }