| 1 | <?php |
||
| 7 | |||
| 8 | class Converter |
||
| 9 | { |
||
| 10 | private $romanoParaNumero = [ |
||
| 11 | 'M' => 1000, |
||
| 12 | 'D' => 500, |
||
| 13 | 'C' => 100, |
||
| 14 | 'L' => 50, |
||
| 15 | 'X' => 10, |
||
| 16 | 'V' => 5, |
||
| 17 | 'I' => 1, |
||
| 18 | ]; |
||
| 19 | 30 | ||
| 20 | public function toDecimal($numeroRomano) |
||
| 21 | 30 | { |
|
| 22 | 30 | $valor = 0; |
|
| 23 | 30 | $valorAnterior = 0; |
|
| 24 | $repeticoes = 0; |
||
| 25 | 30 | ||
| 26 | 30 | for ($i = strlen($numeroRomano) - 1; $i >= 0; $i--) { |
|
| 27 | 30 | $letra = $numeroRomano[$i]; |
|
| 28 | |||
| 29 | 30 | if (! array_key_exists($letra, $this->romanoParaNumero)) { |
|
| 30 | 6 | throw new SimboloInvalidoException( |
|
| 31 | $letra . 'É um simbolo invalido' |
||
| 32 | 6 | ); |
|
| 33 | 3 | } |
|
| 34 | 2 | ||
| 35 | 2 | $valorAtual = $this->romanoParaNumero[$letra]; |
|
| 36 | |||
| 37 | 4 | if ($valorAtual == $valorAnterior) { |
|
| 38 | 30 | $repeticoes++; |
|
| 39 | |||
| 40 | if ($repeticoes >= 3) { |
||
| 41 | 30 | throw new MaisDeTresSimbolosIguaisException( |
|
| 42 | 30 | 'Os simbolos só podem ser repitidos até três vezes.' |
|
| 43 | 20 | ); |
|
| 44 | 3 | } |
|
| 45 | } else { |
||
| 46 | $repeticoes = 0; |
||
| 47 | 30 | } |
|
| 48 | 20 | ||
| 49 | if ($valorAtual >= $valorAnterior) { |
||
| 50 | 27 | $valor += $valorAtual; |
|
| 51 | } else { |
||
| 52 | $valor -= $valorAtual; |
||
| 53 | } |
||
| 66 |