Skip to content

Commit 814d78b

Browse files
authored
Merge pull request #100 from amirhossein-fzl/improvment-even-number-rule-performance
[1.x] Improvment even number rule performance
2 parents 1f49802 + 93519d3 commit 814d78b

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

src/Rules/ValidEvenNumber.php

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,20 @@ class ValidEvenNumber implements Rule
1111
*/
1212
public function passes($attribute, $value): bool
1313
{
14-
return preg_match('/^\d*[02468]$/', $value);
14+
$number = strval($value);
15+
$number = explode('.', $number);
16+
17+
if (isset($number[1]) && $number[1] != 0) {
18+
return false;
19+
}
20+
21+
$number = $number[0];
22+
23+
if (extension_loaded('gmp')) {
24+
return gmp_cmp(gmp_mod($number, '2'), '0') === 0;
25+
}
26+
27+
return $number % 2 === 0;
1528
}
1629

1730
/**

tests/Rules/ValidEvenNumberTest.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,36 @@ public function test_check_number_is_not_even()
3030

3131
$this->assertFalse($passes);
3232
}
33+
34+
/**
35+
* Test float number is even.
36+
*
37+
* @test
38+
*
39+
* @return void
40+
*/
41+
public function check_float_number_is_even()
42+
{
43+
$rules = ['even_number' => [new ValidEvenNumber]];
44+
$data = ['even_number' => '754.00'];
45+
$passes = $this->app['validator']->make($data, $rules)->passes();
46+
47+
$this->assertTrue($passes);
48+
}
49+
50+
/**
51+
* Test float number is not even.
52+
*
53+
* @test
54+
*
55+
* @return void
56+
*/
57+
public function check_float_number_is_not_even()
58+
{
59+
$rules = ['even_number' => [new ValidEvenNumber]];
60+
$data = ['even_number' => '333.13'];
61+
$passes = $this->app['validator']->make($data, $rules)->passes();
62+
63+
$this->assertFalse($passes);
64+
}
3365
}

0 commit comments

Comments
 (0)