Completed
Push — master ( 1ea133...692929 )
by recca
07:00
created

Chinese::toNumber()   C

Complexity

Conditions 7
Paths 10

Size

Total Lines 41
Code Lines 28

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 30
CRAP Score 7.0016

Importance

Changes 0
Metric Value
dl 0
loc 41
ccs 30
cts 31
cp 0.9677
rs 6.7272
c 0
b 0
f 0
cc 7
eloc 28
nc 10
nop 0
crap 7.0016
1
<?php
2
3
namespace Recca0120\Lodash\JString\Extensions;
4
5
class Chinese
6
{
7
    /**
8
     * $numberUnits.
9
     *
10
     * @var array
11
     */
12
    public static $numberUnits = [
13
        '個' => 1,
14
        '十' => 10,
15
        '百' => 100,
16
        '千' => 1000,
17
        '萬' => 10000,
18
    ];
19
20
    /**
21
     * $subject.
22
     *
23
     * @var string
24
     */
25
    protected $subject;
26
27
    /**
28
     * __construct.
29
     *
30
     * @param string $subject
31
     */
32 7
    public function __construct($subject)
33
    {
34 7
        $this->subject = $subject;
35 7
    }
36
37
    /**
38
     * toNumber.
39
     *
40
     * @return string
41
     */
42 7
    public function toNumber()
43
    {
44 7
        $sum = 0;
45 7
        $matches = [];
46 7
        if ((bool) preg_match_all('/(?P<number>[一二三四五六七八九]+)?(?P<unit>[萬千百十])?/u', $this->subject, $matches, PREG_SET_ORDER) === false) {
47
            return $sum;
48
        }
49
50 7
        $sum = 0;
51 7
        foreach ((array) $matches as $token) {
52 7
            $unit = empty($token['unit']) === false ? $token['unit'] : '個';
53 7
            $unit = static::$numberUnits[$unit];
54 7
            if (empty($token['number']) === true) {
55 7
                $sum = ($sum === 0 ? 1 : $sum) * $unit;
56
57 7
                continue;
58
            }
59
60 7
            $number = $token['number'];
61 7
            $number = strtr($number, [
62 7
                '零' => 0,
63 7
                '一' => 1,
64 7
                '二' => 2,
65 7
                '三' => 3,
66 7
                '四' => 4,
67 7
                '五' => 5,
68 7
                '六' => 6,
69 7
                '七' => 7,
70 7
                '八' => 8,
71 7
                '九' => 9,
72 7
            ]);
73
74 7
            if ($unit >= 10000) {
75 2
                $sum = $sum * $unit;
76 2
            }
77
78 7
            $sum += ($number * $unit);
79 7
        }
80
81 7
        return $sum;
82
    }
83
}
84