Completed
Push — master ( f11d2c...b71965 )
by Maringa
01:15
created

Converter::toDecimal()   B

Complexity

Conditions 5
Paths 6

Size

Total Lines 32
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 20
CRAP Score 5

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 32
ccs 20
cts 20
cp 1
rs 8.439
cc 5
eloc 19
nc 6
nop 1
crap 5
1
<?php
2
3
namespace MaringaDojo\Romanizer;
4
5
use MaringaDojo\Romanizer\Exceptions\MaisDeTresSimbolosIguaisException;
6
7
class Converter
8
{
9
    private $_romanoParaNumero = [
10
        'M' => 1000,
11
        'D' => 500,
12
        'C' => 100,
13
        'L' => 50,
14
        'X' => 10,
15
        'V' => 5,
16
        'I' => 1,
17
    ];
18
19 30
    public function toDecimal($numeroRomano)
20
    {
21 30
        $valor = 0;
22 30
        $valorAnterior = 0;
23 30
        $repeticoes = 0;
24
25 30
        for ($i = strlen($numeroRomano) - 1; $i >= 0; $i--) {
26
27 30
            $letra = $numeroRomano[$i];
28 30
            $valorAtual = $this->_romanoParaNumero[$letra];
29
30 30
            if ($valorAtual == $valorAnterior) {
31 6
                $repeticoes++;
32
33 6
                if ($repeticoes >= 3) {
34 3
                    throw new MaisDeTresSimbolosIguaisException("Os simbolos só podem ser repitidos até três vezes.", 1);
35
                }
36 6
            } else {
37 30
                $repeticoes = 0;
38
            }
39
40 30
            if ($valorAtual >= $valorAnterior) {
41 30
                $valor += $valorAtual;
42 30
            } else {
43 3
                $valor -= $valorAtual;
44
            }
45
46 30
            $valorAnterior = $valorAtual;
47 30
        }
48
49 27
        return $valor;
50
    }
51
52
}
53