Test Failed
Pull Request — main (#34)
by
unknown
03:38
created

SanitizesNumbers::is_good_float()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 19
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 8
Bugs 0 Features 0
Metric Value
cc 4
eloc 9
c 8
b 0
f 0
nc 3
nop 1
dl 0
loc 19
ccs 0
cts 0
cp 0
crap 20
rs 9.9666
1
<?php
2
3
declare(strict_types=1);
4
5
namespace MichaelRubel\ValueObjects\Concerns;
6
7
use LengthException;
8
9
trait SanitizesNumbers
10
{
11
    /**
12
     * @param  int|string|float|null  $number
13
     *
14 80
     * @return string
15
     */
16 80
    protected function sanitize(int|string|float|null $number): string
17
    {
18 80
        if (is_float($number) && ! $this->is_good_float($number)) {
19
            throw new LengthException();
20 80
        }
21 10
22 10
        $number = str((string) $number)->replace(',', '.');
23 10
24 10
        $dots = $number->substrCount('.');
25
26
        if ($dots >= 2) {
27
            $number = $number
28 80
                ->replaceLast('.', ',')
29 80
                ->replace('.', '')
30
                ->replaceLast(',', '.');
31
        }
32
33
        return $number
34
            ->replaceMatches('/[^0-9.]/', '')
35
            ->toString();
36
    }
37
38
    /**
39
     * @param  int|string|float|null  $number
40
     * @return bool
41
     */
42
    private function is_good_float(int|string|float|null $number): bool
43
    {
44
        if (is_float($number)) {
45
            $separate = str($number)->explode('.')->sep;
46
47
            $precision_position = str($separate->get(1, ''))->length();
48
49
            $round_number = round($number, $precision_position);
50
51
            $sum_digits = $separate->sum(function ($item) {
52
                return str($item)->length();
53
            });
54
55
            if (($round_number == $number && $sum_digits <= PHP_FLOAT_DIG - 1)) {
56
                return true;
57
            }
58
        }
59
60
        return false;
61
    }
62
}
63