Completed
Push — master ( 703546...76237a )
by Hannes
02:22
created

SignalMoneyParser   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 48
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 2

Importance

Changes 0
Metric Value
dl 0
loc 48
rs 10
c 0
b 0
f 0
wmc 6
lcom 0
cbo 2

1 Method

Rating   Name   Duplication   Size   Complexity  
B parse() 0 32 6
1
<?php
2
/**
3
 * This file is part of byrokrat\autogiro.
4
 *
5
 * byrokrat\autogiro is free software: you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License as published
7
 * by the Free Software Foundation, either version 3 of the License, or
8
 * (at your option) any later version.
9
 *
10
 * byrokrat\autogiro is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with byrokrat\autogiro. If not, see <http://www.gnu.org/licenses/>.
17
 *
18
 * Copyright 2016-19 Hannes Forsgård
19
 */
20
21
declare(strict_types = 1);
22
23
namespace byrokrat\autogiro\Money;
24
25
use byrokrat\autogiro\Exception\RuntimeException;
26
use Money\Money;
27
use Money\MoneyParser;
28
29
final class SignalMoneyParser implements MoneyParser
30
{
31
    private const SIGNALS = [
32
        'å' => '0',
33
        'J' => '1',
34
        'K' => '2',
35
        'L' => '3',
36
        'M' => '4',
37
        'N' => '5',
38
        'O' => '6',
39
        'P' => '7',
40
        'Q' => '8',
41
        'R' => '9',
42
    ];
43
44
    public function parse($money, $forceCurrency = null)
45
    {
46
        if (!is_string($money)) {
47
            throw new \InvalidArgumentException('Money must be a string');
48
        }
49
50
        if (empty($money)) {
51
            throw new RuntimeException('Money must not be empty');
52
        }
53
54
        $money = ltrim($money, '0');
55
56
        if (empty($money)) {
57
            $money = '0';
58
        }
59
60
        $lastChar = mb_substr($money, -1);
61
62
        if (isset(self::SIGNALS[$lastChar])) {
63
            $money = sprintf(
64
                '-%s%s',
65
                mb_substr($money, 0, mb_strlen($money)-1),
66
                self::SIGNALS[$lastChar]
67
            );
68
        }
69
70
        if (!preg_match('/^\-?[0-9]+$/', $money)) {
71
            throw new RuntimeException('Money is not a valid singal string');
72
        }
73
74
        return Money::SEK($money);
75
    }
76
}
77