Skip to content

Commit b8c1939

Browse files
authored
Simplify logic of number_to_roman function
1 parent 2165b11 commit b8c1939

File tree

1 file changed

+24
-67
lines changed

1 file changed

+24
-67
lines changed

system/Helpers/number_helper.php

Lines changed: 24 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -182,79 +182,36 @@ function format_number(float $num, int $precision = 1, ?string $locale = null, a
182182
*/
183183
function number_to_roman(string $num): ?string
184184
{
185+
static $map = [
186+
'M' => 1000,
187+
'CM' => 900,
188+
'D' => 500,
189+
'CD' => 400,
190+
'C' => 100,
191+
'XC' => 90,
192+
'L' => 50,
193+
'XL' => 40,
194+
'X' => 10,
195+
'IX' => 9,
196+
'V' => 5,
197+
'IV' => 4,
198+
'I' => 1,
199+
];
200+
185201
$num = (int) $num;
202+
186203
if ($num < 1 || $num > 3999) {
187204
return null;
188205
}
189206

190-
$_number_to_roman = static function ($num, $th) use (&$_number_to_roman) {
191-
$return = '';
192-
$key1 = null;
193-
$key2 = null;
194-
195-
switch ($th) {
196-
case 1:
197-
$key1 = 'I';
198-
$key2 = 'V';
199-
$keyF = 'X';
200-
break;
201-
202-
case 2:
203-
$key1 = 'X';
204-
$key2 = 'L';
205-
$keyF = 'C';
206-
break;
207-
208-
case 3:
209-
$key1 = 'C';
210-
$key2 = 'D';
211-
$keyF = 'M';
212-
break;
213-
214-
case 4:
215-
$key1 = 'M';
216-
break;
217-
}
218-
$n = $num % 10;
219-
220-
switch ($n) {
221-
case 1:
222-
case 2:
223-
case 3:
224-
$return = str_repeat($key1, $n);
225-
break;
207+
$result = '';
226208

227-
case 4:
228-
$return = $key1 . $key2;
229-
break;
230-
231-
case 5:
232-
$return = $key2;
233-
break;
234-
235-
case 6:
236-
case 7:
237-
case 8:
238-
$return = $key2 . str_repeat($key1, $n - 5);
239-
break;
240-
241-
case 9:
242-
$return = $key1 . $keyF; // @phpstan-ignore-line
243-
break;
244-
}
245-
246-
switch ($num) {
247-
case 10:
248-
$return = $keyF; // @phpstan-ignore-line
249-
break;
250-
}
251-
if ($num > 10) {
252-
$return = $_number_to_roman($num / 10, ++$th) . $return;
253-
}
254-
255-
return $return;
256-
};
209+
foreach ($map as $roman => $arabic) {
210+
$repeat = (int) floor($num / $arabic);
211+
$result .= str_repeat($roman, $repeat);
212+
$num %= $arabic;
213+
}
257214

258-
return $_number_to_roman($num, 1);
215+
return $result;
259216
}
260217
}

0 commit comments

Comments
 (0)