Skip to content

Commit 8ed2ed8

Browse files
authored
Merge pull request #102 from milwad-dev/improve-even-odd-rules
[1.x] Improve even odd rules
2 parents bc3faac + 77d2e1d commit 8ed2ed8

File tree

5 files changed

+78
-1
lines changed

5 files changed

+78
-1
lines changed

docs/1.x/valid-even-number.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,5 @@ return [
99
'number' => ['required', new ValidEvenNumber()], // number => 1024
1010
];
1111
```
12+
13+
> Consider installing the `gmp` extension to significantly enhance performance when working with large numbers. It can greatly optimize your calculations and improve efficiency.

docs/1.x/valid-odd-number.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,5 @@ return [
99
'number' => ['required', new ValidOddNumber()], // number => 4321
1010
];
1111
```
12+
13+
> Consider installing the `gmp` extension to significantly enhance performance when working with large numbers. It can greatly optimize your calculations and improve efficiency.

src/Rules/ValidEvenNumber.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public function passes($attribute, $value): bool
1818
$number = strval($value);
1919
$number = explode('.', $number);
2020

21+
// Check if there is a decimal part and it's not zero
2122
if (isset($number[1]) && $number[1] != 0) {
2223
return false;
2324
}

src/Rules/ValidOddNumber.php

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,25 @@ class ValidOddNumber implements Rule
1111
*/
1212
public function passes($attribute, $value): bool
1313
{
14-
return preg_match('/^\d*[13579]$/', $value);
14+
if (! is_numeric($value)) {
15+
return false;
16+
}
17+
18+
$number = strval($value);
19+
$number = explode('.', $number);
20+
21+
// Check if there is a decimal part and it's not zero
22+
if (isset($number[1]) && $number[1] != 0) {
23+
return false;
24+
}
25+
26+
$number = $number[0];
27+
28+
if (extension_loaded('gmp')) {
29+
return gmp_cmp(gmp_mod($number, '2'), '0') !== 0;
30+
}
31+
32+
return $number % 2 !== 0;
1533
}
1634

1735
/**

tests/Rules/ValidOddNumberTest.php

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,58 @@ public function test_number_is_not_odd()
3030

3131
$this->assertFalse($passes);
3232
}
33+
34+
/**
35+
* Test float number is odd.
36+
*
37+
* @test
38+
*
39+
* @return void
40+
*/
41+
public function check_float_number_is_odd()
42+
{
43+
$rules = ['odd_number' => [new ValidOddNumber]];
44+
$data = ['odd_number' => '753.00'];
45+
$passes = $this->app['validator']->make($data, $rules)->passes();
46+
47+
$this->assertTrue($passes);
48+
}
49+
50+
/**
51+
* Test float number is not odd.
52+
*
53+
* @test
54+
*
55+
* @return void
56+
*/
57+
public function check_float_number_is_not_odd()
58+
{
59+
$rules = ['odd_number' => [new ValidOddNumber]];
60+
$data = ['odd_number' => '333.14'];
61+
$passes = $this->app['validator']->make($data, $rules)->passes();
62+
63+
$this->assertFalse($passes);
64+
65+
$rules = ['odd_number' => [new ValidOddNumber]];
66+
$data = ['odd_number' => '322.00'];
67+
$passes = $this->app['validator']->make($data, $rules)->passes();
68+
69+
$this->assertFalse($passes);
70+
}
71+
72+
/**
73+
* Test non-numeric values.
74+
*
75+
* @test
76+
*
77+
* @return void
78+
*/
79+
public function check_non_numeric_values()
80+
{
81+
$rules = ['odd_number' => [new ValidOddNumber]];
82+
$data = ['odd_number' => 'abc'];
83+
$passes = $this->app['validator']->make($data, $rules)->passes();
84+
85+
$this->assertFalse($passes);
86+
}
3387
}

0 commit comments

Comments
 (0)