Passed
Push — develop ( 991cd4...4c67f0 )
by Florian
04:17
created

NumericUtil   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 40
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 5
Bugs 0 Features 0
Metric Value
eloc 19
c 5
b 0
f 0
dl 0
loc 40
ccs 14
cts 14
cp 1
rs 10
wmc 7

3 Methods

Rating   Name   Duplication   Size   Complexity  
A parseArea() 0 7 2
A parseRoomsCount() 0 11 3
A parsePrice() 0 7 2
1
<?php
2
3
namespace App\Util;
4
5
use function str_replace;
6
7
class NumericUtil
8
{
9
    private const REGEX_START         = '(?:^|\s|>)';
10
    private const REGEX_END           = '(?:$|\s|\.|<)';
11
    private const REGEX_INT           = '((?:(?:\d{1,3}\s)+\d{3})|\d+)';
12
    private const REGEX_FLOAT         = '((?:(?:(?:\d{1,3}\s)+\d{3})|\d+)(?:(?:\.|,)\d+)?)';
13
    private const REGEX_PRICE         = self::REGEX_START . self::REGEX_FLOAT . '\s?(?:€|euros?)' . self::REGEX_END;
14
    private const REGEX_AREA          = self::REGEX_START . self::REGEX_FLOAT . '\s?(?:m²|m2)' . self::REGEX_END;
15
    private const REGEX_ROOMS_COUNT   = self::REGEX_START . self::REGEX_INT . '\s?(?:pi[e\p{L}]ce(?:s|\(s\))?|p)' . self::REGEX_END;
16
    private const REGEX_ROOMS_COUNT_2 = self::REGEX_START . '(?:T|F|type\s?)' . self::REGEX_INT . self::REGEX_END;
17
18 27
    public static function parsePrice(string $value): ?float
19
    {
20 27
        if (1 === preg_match(sprintf('/%s/ui', self::REGEX_PRICE), $value, $matches)) {
21 24
            return (float) str_replace([' ', ' ', ','], ['', '', '.'], $matches[1]);
22
        }
23
24 3
        return null;
25
    }
26
27 26
    public static function parseArea(string $value): ?float
28
    {
29 26
        if (1 === preg_match(sprintf('/%s/ui', self::REGEX_AREA), $value, $matches)) {
30 18
            return (float) str_replace([' ', ' ', ','], ['', '', '.'], $matches[1]);
31
        }
32
33 8
        return null;
34
    }
35
36 31
    public static function parseRoomsCount(string $value): ?int
37
    {
38 31
        if (1 === preg_match(sprintf('/%s/ui', self::REGEX_ROOMS_COUNT), $value, $matches)) {
39 19
            return (int) $matches[1];
40
        }
41
42 12
        if (1 === preg_match(sprintf('/%s/ui', self::REGEX_ROOMS_COUNT_2), $value, $matches)) {
43 6
            return (int) $matches[1];
44
        }
45
46 6
        return null;
47
    }
48
}
49