Completed
Pull Request — master (#86)
by Scott
01:51
created

En::parse()   B

Complexity

Conditions 7
Paths 6

Size

Total Lines 33

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
nc 6
nop 1
dl 0
loc 33
rs 8.4586
c 0
b 0
f 0
1
<?php
2
namespace Povils\PHPMND\Languages;
3
4
use Povils\PHPMND\Language;
5
6
class En implements Language
7
{
8
    protected $specialNumbers = [
9
        2 => [
10
            'half',
11
        ],
12
        3 => [
13
            'third',
14
        ],
15
        7 => [
16
            'week',
17
        ],
18
        10 => [
19
            'tenth',
20
            'decile',
21
        ],
22
        24 => [
23
            'hours',
24
        ],
25
        28 => [
26
            'February',
27
        ],
28
        60 => [
29
            'second',
30
            'minute',
31
        ],
32
        100 => [
33
            'percent',
34
            'centile'
35
        ],
36
    ];
37
38
    protected $numberMapping = [
39
        'zero',
40
        'one',
41
        'two',
42
        'three',
43
        'four',
44
        'five',
45
        'six',
46
        'seven',
47
        'eight',
48
        'nine',
49
        'ten',
50
        'eleven',
51
        'twelve',
52
        'thirteen',
53
        'fourteen',
54
        'fifteen',
55
        'sixteen',
56
        'seventeen',
57
        'eighteen',
58
        'nineteen',
59
        'twenty',
60
        30 => 'thirty',
61
        40 => 'forty',
62
        50 => 'fifty',
63
        60 => 'sixty',
64
        70 => 'seventy',
65
        80 => 'eighty',
66
        90 => 'ninety',
67
        100 => 'hundred',
68
        1000 => 'thousand',
69
        1000000 => 'million',
70
    ];
71
72
    public function parse(int $number): array
73
    {
74
75
        end($this->numberMapping);
76
        $final = $this->specialNumbers[$number] ?? [];
77
78
        if ($number < 0) {
79
            $final [] = 'minus';
80
            $final [] = 'negative';
81
82
            $number = -$number;
83
        }
84
85
        do {
86
            $key = key($this->numberMapping);
87
88
            if ($number < $key) {
89
                continue;
90
            }
91
            $multiple = 1;
92
93
            if ($key * 2 < $number && $key > 0) {
94
                $multiple = floor($number / $key);
95
96
                $final = array_merge($final, $this->parse($multiple));
97
            }
98
99
            $final[] = current($this->numberMapping);
100
            $number -= $key * $multiple;
101
        } while (prev($this->numberMapping) !== false && $number > 0);
102
103
        return $final;
104
    }
105
}
106