Code Coverage  | 
     ||||||||||
Classes and Traits  | 
      Functions and Methods  | 
      Lines  | 
     ||||||||
| Total |         | 
      100.00%  | 
      1 / 1  | 
              | 
      100.00%  | 
      2 / 2  | 
      CRAP |         | 
      100.00%  | 
      31 / 31  | 
     
| Roman |         | 
      100.00%  | 
      1 / 1  | 
              | 
      100.00%  | 
      2 / 2  | 
      11 |         | 
      100.00%  | 
      31 / 31  | 
     
| to |         | 
      100.00%  | 
      1 / 1  | 
      5 |         | 
      100.00%  | 
      12 / 12  | 
     |||
| from |         | 
      100.00%  | 
      1 / 1  | 
      6 |         | 
      100.00%  | 
      19 / 19  | 
     |||
| <?php | |
| namespace Popy\Calendar\Formatter\NumberConverter; | |
| use Popy\Calendar\Formatter\NumberConverterInterface; | |
| /** | |
| * Roman units converter. | |
| */ | |
| class Roman implements NumberConverterInterface | |
| { | |
| protected static $table = [ | |
| 'M' => 1000, | |
| 'CM' => 900, | |
| 'D' => 500, | |
| 'CD' => 400, | |
| 'C' => 100, | |
| 'XC' => 90, | |
| 'L' => 50, | |
| 'XL' => 40, | |
| 'X' => 10, | |
| 'IX' => 9, | |
| 'V' => 5, | |
| 'IV' => 4, | |
| 'I' => 1, | |
| ]; | |
| /** | |
| * @inheritDoc | |
| */ | |
| public function to($input) | |
| { | |
| if ($input === 0) { | |
| return '0'; | |
| } | |
| if ($input < 0) { | |
| return '-' . $this->to(-$input); | |
| } | |
| $res = ''; | |
| foreach (self::$table as $symbol => $value) { | |
| while ($input >= $value) { | |
| $res .= $symbol; | |
| $input -= $value; | |
| } | |
| } | |
| return $res; | |
| } | |
| /** | |
| * @inheritDoc | |
| */ | |
| public function from($input) | |
| { | |
| if ($input === '0') { | |
| return 0; | |
| } | |
| $res = $i = 0; | |
| $len = strlen($input); | |
| $sign = 1; | |
| if (substr($input, 0, 1) === '-') { | |
| $sign = -1; | |
| $i = 1; | |
| } | |
| while ($i < $len) { | |
| foreach (static::$table as $symbol => $value) { | |
| $sl = strlen($symbol); | |
| if ($symbol === substr($input, $i, $sl)) { | |
| $res += $value; | |
| $i += $sl; | |
| continue 2; | |
| } | |
| } | |
| // If nothing matched, exit. | |
| return null; | |
| } | |
| return $sign * $res; | |
| } | |
| } |