Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.0.x will end 8 May 2023 (12 months).
  • Bug fixes for security issues in 4.0.x will end 13 November 2023 (18 months).
  • PHP version: minimum PHP 7.3.0 Note: the minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is also supported.

Differences Between: [Versions 400 and 401] [Versions 400 and 402] [Versions 400 and 403]

   1  <?php
   2  
   3  namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig;
   4  
   5  use PhpOffice\PhpSpreadsheet\Calculation\Exception;
   6  use PhpOffice\PhpSpreadsheet\Calculation\Functions;
   7  
   8  class Roman
   9  {
  10      private const VALUES = [
  11          45 => ['VL'],
  12          46 => ['VLI'],
  13          47 => ['VLII'],
  14          48 => ['VLIII'],
  15          49 => ['VLIV', 'IL'],
  16          95 => ['VC'],
  17          96 => ['VCI'],
  18          97 => ['VCII'],
  19          98 => ['VCIII'],
  20          99 => ['VCIV', 'IC'],
  21          145 => ['CVL'],
  22          146 => ['CVLI'],
  23          147 => ['CVLII'],
  24          148 => ['CVLIII'],
  25          149 => ['CVLIV', 'CIL'],
  26          195 => ['CVC'],
  27          196 => ['CVCI'],
  28          197 => ['CVCII'],
  29          198 => ['CVCIII'],
  30          199 => ['CVCIV', 'CIC'],
  31          245 => ['CCVL'],
  32          246 => ['CCVLI'],
  33          247 => ['CCVLII'],
  34          248 => ['CCVLIII'],
  35          249 => ['CCVLIV', 'CCIL'],
  36          295 => ['CCVC'],
  37          296 => ['CCVCI'],
  38          297 => ['CCVCII'],
  39          298 => ['CCVCIII'],
  40          299 => ['CCVCIV', 'CCIC'],
  41          345 => ['CCCVL'],
  42          346 => ['CCCVLI'],
  43          347 => ['CCCVLII'],
  44          348 => ['CCCVLIII'],
  45          349 => ['CCCVLIV', 'CCCIL'],
  46          395 => ['CCCVC'],
  47          396 => ['CCCVCI'],
  48          397 => ['CCCVCII'],
  49          398 => ['CCCVCIII'],
  50          399 => ['CCCVCIV', 'CCCIC'],
  51          445 => ['CDVL'],
  52          446 => ['CDVLI'],
  53          447 => ['CDVLII'],
  54          448 => ['CDVLIII'],
  55          449 => ['CDVLIV', 'CDIL'],
  56          450 => ['LD'],
  57          451 => ['LDI'],
  58          452 => ['LDII'],
  59          453 => ['LDIII'],
  60          454 => ['LDIV'],
  61          455 => ['LDV'],
  62          456 => ['LDVI'],
  63          457 => ['LDVII'],
  64          458 => ['LDVIII'],
  65          459 => ['LDIX'],
  66          460 => ['LDX'],
  67          461 => ['LDXI'],
  68          462 => ['LDXII'],
  69          463 => ['LDXIII'],
  70          464 => ['LDXIV'],
  71          465 => ['LDXV'],
  72          466 => ['LDXVI'],
  73          467 => ['LDXVII'],
  74          468 => ['LDXVIII'],
  75          469 => ['LDXIX'],
  76          470 => ['LDXX'],
  77          471 => ['LDXXI'],
  78          472 => ['LDXXII'],
  79          473 => ['LDXXIII'],
  80          474 => ['LDXXIV'],
  81          475 => ['LDXXV'],
  82          476 => ['LDXXVI'],
  83          477 => ['LDXXVII'],
  84          478 => ['LDXXVIII'],
  85          479 => ['LDXXIX'],
  86          480 => ['LDXXX'],
  87          481 => ['LDXXXI'],
  88          482 => ['LDXXXII'],
  89          483 => ['LDXXXIII'],
  90          484 => ['LDXXXIV'],
  91          485 => ['LDXXXV'],
  92          486 => ['LDXXXVI'],
  93          487 => ['LDXXXVII'],
  94          488 => ['LDXXXVIII'],
  95          489 => ['LDXXXIX'],
  96          490 => ['LDXL', 'XD'],
  97          491 => ['LDXLI', 'XDI'],
  98          492 => ['LDXLII', 'XDII'],
  99          493 => ['LDXLIII', 'XDIII'],
 100          494 => ['LDXLIV', 'XDIV'],
 101          495 => ['LDVL', 'XDV', 'VD'],
 102          496 => ['LDVLI', 'XDVI', 'VDI'],
 103          497 => ['LDVLII', 'XDVII', 'VDII'],
 104          498 => ['LDVLIII', 'XDVIII', 'VDIII'],
 105          499 => ['LDVLIV', 'XDIX', 'VDIV', 'ID'],
 106          545 => ['DVL'],
 107          546 => ['DVLI'],
 108          547 => ['DVLII'],
 109          548 => ['DVLIII'],
 110          549 => ['DVLIV', 'DIL'],
 111          595 => ['DVC'],
 112          596 => ['DVCI'],
 113          597 => ['DVCII'],
 114          598 => ['DVCIII'],
 115          599 => ['DVCIV', 'DIC'],
 116          645 => ['DCVL'],
 117          646 => ['DCVLI'],
 118          647 => ['DCVLII'],
 119          648 => ['DCVLIII'],
 120          649 => ['DCVLIV', 'DCIL'],
 121          695 => ['DCVC'],
 122          696 => ['DCVCI'],
 123          697 => ['DCVCII'],
 124          698 => ['DCVCIII'],
 125          699 => ['DCVCIV', 'DCIC'],
 126          745 => ['DCCVL'],
 127          746 => ['DCCVLI'],
 128          747 => ['DCCVLII'],
 129          748 => ['DCCVLIII'],
 130          749 => ['DCCVLIV', 'DCCIL'],
 131          795 => ['DCCVC'],
 132          796 => ['DCCVCI'],
 133          797 => ['DCCVCII'],
 134          798 => ['DCCVCIII'],
 135          799 => ['DCCVCIV', 'DCCIC'],
 136          845 => ['DCCCVL'],
 137          846 => ['DCCCVLI'],
 138          847 => ['DCCCVLII'],
 139          848 => ['DCCCVLIII'],
 140          849 => ['DCCCVLIV', 'DCCCIL'],
 141          895 => ['DCCCVC'],
 142          896 => ['DCCCVCI'],
 143          897 => ['DCCCVCII'],
 144          898 => ['DCCCVCIII'],
 145          899 => ['DCCCVCIV', 'DCCCIC'],
 146          945 => ['CMVL'],
 147          946 => ['CMVLI'],
 148          947 => ['CMVLII'],
 149          948 => ['CMVLIII'],
 150          949 => ['CMVLIV', 'CMIL'],
 151          950 => ['LM'],
 152          951 => ['LMI'],
 153          952 => ['LMII'],
 154          953 => ['LMIII'],
 155          954 => ['LMIV'],
 156          955 => ['LMV'],
 157          956 => ['LMVI'],
 158          957 => ['LMVII'],
 159          958 => ['LMVIII'],
 160          959 => ['LMIX'],
 161          960 => ['LMX'],
 162          961 => ['LMXI'],
 163          962 => ['LMXII'],
 164          963 => ['LMXIII'],
 165          964 => ['LMXIV'],
 166          965 => ['LMXV'],
 167          966 => ['LMXVI'],
 168          967 => ['LMXVII'],
 169          968 => ['LMXVIII'],
 170          969 => ['LMXIX'],
 171          970 => ['LMXX'],
 172          971 => ['LMXXI'],
 173          972 => ['LMXXII'],
 174          973 => ['LMXXIII'],
 175          974 => ['LMXXIV'],
 176          975 => ['LMXXV'],
 177          976 => ['LMXXVI'],
 178          977 => ['LMXXVII'],
 179          978 => ['LMXXVIII'],
 180          979 => ['LMXXIX'],
 181          980 => ['LMXXX'],
 182          981 => ['LMXXXI'],
 183          982 => ['LMXXXII'],
 184          983 => ['LMXXXIII'],
 185          984 => ['LMXXXIV'],
 186          985 => ['LMXXXV'],
 187          986 => ['LMXXXVI'],
 188          987 => ['LMXXXVII'],
 189          988 => ['LMXXXVIII'],
 190          989 => ['LMXXXIX'],
 191          990 => ['LMXL', 'XM'],
 192          991 => ['LMXLI', 'XMI'],
 193          992 => ['LMXLII', 'XMII'],
 194          993 => ['LMXLIII', 'XMIII'],
 195          994 => ['LMXLIV', 'XMIV'],
 196          995 => ['LMVL', 'XMV', 'VM'],
 197          996 => ['LMVLI', 'XMVI', 'VMI'],
 198          997 => ['LMVLII', 'XMVII', 'VMII'],
 199          998 => ['LMVLIII', 'XMVIII', 'VMIII'],
 200          999 => ['LMVLIV', 'XMIX', 'VMIV', 'IM'],
 201          1045 => ['MVL'],
 202          1046 => ['MVLI'],
 203          1047 => ['MVLII'],
 204          1048 => ['MVLIII'],
 205          1049 => ['MVLIV', 'MIL'],
 206          1095 => ['MVC'],
 207          1096 => ['MVCI'],
 208          1097 => ['MVCII'],
 209          1098 => ['MVCIII'],
 210          1099 => ['MVCIV', 'MIC'],
 211          1145 => ['MCVL'],
 212          1146 => ['MCVLI'],
 213          1147 => ['MCVLII'],
 214          1148 => ['MCVLIII'],
 215          1149 => ['MCVLIV', 'MCIL'],
 216          1195 => ['MCVC'],
 217          1196 => ['MCVCI'],
 218          1197 => ['MCVCII'],
 219          1198 => ['MCVCIII'],
 220          1199 => ['MCVCIV', 'MCIC'],
 221          1245 => ['MCCVL'],
 222          1246 => ['MCCVLI'],
 223          1247 => ['MCCVLII'],
 224          1248 => ['MCCVLIII'],
 225          1249 => ['MCCVLIV', 'MCCIL'],
 226          1295 => ['MCCVC'],
 227          1296 => ['MCCVCI'],
 228          1297 => ['MCCVCII'],
 229          1298 => ['MCCVCIII'],
 230          1299 => ['MCCVCIV', 'MCCIC'],
 231          1345 => ['MCCCVL'],
 232          1346 => ['MCCCVLI'],
 233          1347 => ['MCCCVLII'],
 234          1348 => ['MCCCVLIII'],
 235          1349 => ['MCCCVLIV', 'MCCCIL'],
 236          1395 => ['MCCCVC'],
 237          1396 => ['MCCCVCI'],
 238          1397 => ['MCCCVCII'],
 239          1398 => ['MCCCVCIII'],
 240          1399 => ['MCCCVCIV', 'MCCCIC'],
 241          1445 => ['MCDVL'],
 242          1446 => ['MCDVLI'],
 243          1447 => ['MCDVLII'],
 244          1448 => ['MCDVLIII'],
 245          1449 => ['MCDVLIV', 'MCDIL'],
 246          1450 => ['MLD'],
 247          1451 => ['MLDI'],
 248          1452 => ['MLDII'],
 249          1453 => ['MLDIII'],
 250          1454 => ['MLDIV'],
 251          1455 => ['MLDV'],
 252          1456 => ['MLDVI'],
 253          1457 => ['MLDVII'],
 254          1458 => ['MLDVIII'],
 255          1459 => ['MLDIX'],
 256          1460 => ['MLDX'],
 257          1461 => ['MLDXI'],
 258          1462 => ['MLDXII'],
 259          1463 => ['MLDXIII'],
 260          1464 => ['MLDXIV'],
 261          1465 => ['MLDXV'],
 262          1466 => ['MLDXVI'],
 263          1467 => ['MLDXVII'],
 264          1468 => ['MLDXVIII'],
 265          1469 => ['MLDXIX'],
 266          1470 => ['MLDXX'],
 267          1471 => ['MLDXXI'],
 268          1472 => ['MLDXXII'],
 269          1473 => ['MLDXXIII'],
 270          1474 => ['MLDXXIV'],
 271          1475 => ['MLDXXV'],
 272          1476 => ['MLDXXVI'],
 273          1477 => ['MLDXXVII'],
 274          1478 => ['MLDXXVIII'],
 275          1479 => ['MLDXXIX'],
 276          1480 => ['MLDXXX'],
 277          1481 => ['MLDXXXI'],
 278          1482 => ['MLDXXXII'],
 279          1483 => ['MLDXXXIII'],
 280          1484 => ['MLDXXXIV'],
 281          1485 => ['MLDXXXV'],
 282          1486 => ['MLDXXXVI'],
 283          1487 => ['MLDXXXVII'],
 284          1488 => ['MLDXXXVIII'],
 285          1489 => ['MLDXXXIX'],
 286          1490 => ['MLDXL', 'MXD'],
 287          1491 => ['MLDXLI', 'MXDI'],
 288          1492 => ['MLDXLII', 'MXDII'],
 289          1493 => ['MLDXLIII', 'MXDIII'],
 290          1494 => ['MLDXLIV', 'MXDIV'],
 291          1495 => ['MLDVL', 'MXDV', 'MVD'],
 292          1496 => ['MLDVLI', 'MXDVI', 'MVDI'],
 293          1497 => ['MLDVLII', 'MXDVII', 'MVDII'],
 294          1498 => ['MLDVLIII', 'MXDVIII', 'MVDIII'],
 295          1499 => ['MLDVLIV', 'MXDIX', 'MVDIV', 'MID'],
 296          1545 => ['MDVL'],
 297          1546 => ['MDVLI'],
 298          1547 => ['MDVLII'],
 299          1548 => ['MDVLIII'],
 300          1549 => ['MDVLIV', 'MDIL'],
 301          1595 => ['MDVC'],
 302          1596 => ['MDVCI'],
 303          1597 => ['MDVCII'],
 304          1598 => ['MDVCIII'],
 305          1599 => ['MDVCIV', 'MDIC'],
 306          1645 => ['MDCVL'],
 307          1646 => ['MDCVLI'],
 308          1647 => ['MDCVLII'],
 309          1648 => ['MDCVLIII'],
 310          1649 => ['MDCVLIV', 'MDCIL'],
 311          1695 => ['MDCVC'],
 312          1696 => ['MDCVCI'],
 313          1697 => ['MDCVCII'],
 314          1698 => ['MDCVCIII'],
 315          1699 => ['MDCVCIV', 'MDCIC'],
 316          1745 => ['MDCCVL'],
 317          1746 => ['MDCCVLI'],
 318          1747 => ['MDCCVLII'],
 319          1748 => ['MDCCVLIII'],
 320          1749 => ['MDCCVLIV', 'MDCCIL'],
 321          1795 => ['MDCCVC'],
 322          1796 => ['MDCCVCI'],
 323          1797 => ['MDCCVCII'],
 324          1798 => ['MDCCVCIII'],
 325          1799 => ['MDCCVCIV', 'MDCCIC'],
 326          1845 => ['MDCCCVL'],
 327          1846 => ['MDCCCVLI'],
 328          1847 => ['MDCCCVLII'],
 329          1848 => ['MDCCCVLIII'],
 330          1849 => ['MDCCCVLIV', 'MDCCCIL'],
 331          1895 => ['MDCCCVC'],
 332          1896 => ['MDCCCVCI'],
 333          1897 => ['MDCCCVCII'],
 334          1898 => ['MDCCCVCIII'],
 335          1899 => ['MDCCCVCIV', 'MDCCCIC'],
 336          1945 => ['MCMVL'],
 337          1946 => ['MCMVLI'],
 338          1947 => ['MCMVLII'],
 339          1948 => ['MCMVLIII'],
 340          1949 => ['MCMVLIV', 'MCMIL'],
 341          1950 => ['MLM'],
 342          1951 => ['MLMI'],
 343          1952 => ['MLMII'],
 344          1953 => ['MLMIII'],
 345          1954 => ['MLMIV'],
 346          1955 => ['MLMV'],
 347          1956 => ['MLMVI'],
 348          1957 => ['MLMVII'],
 349          1958 => ['MLMVIII'],
 350          1959 => ['MLMIX'],
 351          1960 => ['MLMX'],
 352          1961 => ['MLMXI'],
 353          1962 => ['MLMXII'],
 354          1963 => ['MLMXIII'],
 355          1964 => ['MLMXIV'],
 356          1965 => ['MLMXV'],
 357          1966 => ['MLMXVI'],
 358          1967 => ['MLMXVII'],
 359          1968 => ['MLMXVIII'],
 360          1969 => ['MLMXIX'],
 361          1970 => ['MLMXX'],
 362          1971 => ['MLMXXI'],
 363          1972 => ['MLMXXII'],
 364          1973 => ['MLMXXIII'],
 365          1974 => ['MLMXXIV'],
 366          1975 => ['MLMXXV'],
 367          1976 => ['MLMXXVI'],
 368          1977 => ['MLMXXVII'],
 369          1978 => ['MLMXXVIII'],
 370          1979 => ['MLMXXIX'],
 371          1980 => ['MLMXXX'],
 372          1981 => ['MLMXXXI'],
 373          1982 => ['MLMXXXII'],
 374          1983 => ['MLMXXXIII'],
 375          1984 => ['MLMXXXIV'],
 376          1985 => ['MLMXXXV'],
 377          1986 => ['MLMXXXVI'],
 378          1987 => ['MLMXXXVII'],
 379          1988 => ['MLMXXXVIII'],
 380          1989 => ['MLMXXXIX'],
 381          1990 => ['MLMXL', 'MXM'],
 382          1991 => ['MLMXLI', 'MXMI'],
 383          1992 => ['MLMXLII', 'MXMII'],
 384          1993 => ['MLMXLIII', 'MXMIII'],
 385          1994 => ['MLMXLIV', 'MXMIV'],
 386          1995 => ['MLMVL', 'MXMV', 'MVM'],
 387          1996 => ['MLMVLI', 'MXMVI', 'MVMI'],
 388          1997 => ['MLMVLII', 'MXMVII', 'MVMII'],
 389          1998 => ['MLMVLIII', 'MXMVIII', 'MVMIII'],
 390          1999 => ['MLMVLIV', 'MXMIX', 'MVMIV', 'MIM'],
 391          2045 => ['MMVL'],
 392          2046 => ['MMVLI'],
 393          2047 => ['MMVLII'],
 394          2048 => ['MMVLIII'],
 395          2049 => ['MMVLIV', 'MMIL'],
 396          2095 => ['MMVC'],
 397          2096 => ['MMVCI'],
 398          2097 => ['MMVCII'],
 399          2098 => ['MMVCIII'],
 400          2099 => ['MMVCIV', 'MMIC'],
 401          2145 => ['MMCVL'],
 402          2146 => ['MMCVLI'],
 403          2147 => ['MMCVLII'],
 404          2148 => ['MMCVLIII'],
 405          2149 => ['MMCVLIV', 'MMCIL'],
 406          2195 => ['MMCVC'],
 407          2196 => ['MMCVCI'],
 408          2197 => ['MMCVCII'],
 409          2198 => ['MMCVCIII'],
 410          2199 => ['MMCVCIV', 'MMCIC'],
 411          2245 => ['MMCCVL'],
 412          2246 => ['MMCCVLI'],
 413          2247 => ['MMCCVLII'],
 414          2248 => ['MMCCVLIII'],
 415          2249 => ['MMCCVLIV', 'MMCCIL'],
 416          2295 => ['MMCCVC'],
 417          2296 => ['MMCCVCI'],
 418          2297 => ['MMCCVCII'],
 419          2298 => ['MMCCVCIII'],
 420          2299 => ['MMCCVCIV', 'MMCCIC'],
 421          2345 => ['MMCCCVL'],
 422          2346 => ['MMCCCVLI'],
 423          2347 => ['MMCCCVLII'],
 424          2348 => ['MMCCCVLIII'],
 425          2349 => ['MMCCCVLIV', 'MMCCCIL'],
 426          2395 => ['MMCCCVC'],
 427          2396 => ['MMCCCVCI'],
 428          2397 => ['MMCCCVCII'],
 429          2398 => ['MMCCCVCIII'],
 430          2399 => ['MMCCCVCIV', 'MMCCCIC'],
 431          2445 => ['MMCDVL'],
 432          2446 => ['MMCDVLI'],
 433          2447 => ['MMCDVLII'],
 434          2448 => ['MMCDVLIII'],
 435          2449 => ['MMCDVLIV', 'MMCDIL'],
 436          2450 => ['MMLD'],
 437          2451 => ['MMLDI'],
 438          2452 => ['MMLDII'],
 439          2453 => ['MMLDIII'],
 440          2454 => ['MMLDIV'],
 441          2455 => ['MMLDV'],
 442          2456 => ['MMLDVI'],
 443          2457 => ['MMLDVII'],
 444          2458 => ['MMLDVIII'],
 445          2459 => ['MMLDIX'],
 446          2460 => ['MMLDX'],
 447          2461 => ['MMLDXI'],
 448          2462 => ['MMLDXII'],
 449          2463 => ['MMLDXIII'],
 450          2464 => ['MMLDXIV'],
 451          2465 => ['MMLDXV'],
 452          2466 => ['MMLDXVI'],
 453          2467 => ['MMLDXVII'],
 454          2468 => ['MMLDXVIII'],
 455          2469 => ['MMLDXIX'],
 456          2470 => ['MMLDXX'],
 457          2471 => ['MMLDXXI'],
 458          2472 => ['MMLDXXII'],
 459          2473 => ['MMLDXXIII'],
 460          2474 => ['MMLDXXIV'],
 461          2475 => ['MMLDXXV'],
 462          2476 => ['MMLDXXVI'],
 463          2477 => ['MMLDXXVII'],
 464          2478 => ['MMLDXXVIII'],
 465          2479 => ['MMLDXXIX'],
 466          2480 => ['MMLDXXX'],
 467          2481 => ['MMLDXXXI'],
 468          2482 => ['MMLDXXXII'],
 469          2483 => ['MMLDXXXIII'],
 470          2484 => ['MMLDXXXIV'],
 471          2485 => ['MMLDXXXV'],
 472          2486 => ['MMLDXXXVI'],
 473          2487 => ['MMLDXXXVII'],
 474          2488 => ['MMLDXXXVIII'],
 475          2489 => ['MMLDXXXIX'],
 476          2490 => ['MMLDXL', 'MMXD'],
 477          2491 => ['MMLDXLI', 'MMXDI'],
 478          2492 => ['MMLDXLII', 'MMXDII'],
 479          2493 => ['MMLDXLIII', 'MMXDIII'],
 480          2494 => ['MMLDXLIV', 'MMXDIV'],
 481          2495 => ['MMLDVL', 'MMXDV', 'MMVD'],
 482          2496 => ['MMLDVLI', 'MMXDVI', 'MMVDI'],
 483          2497 => ['MMLDVLII', 'MMXDVII', 'MMVDII'],
 484          2498 => ['MMLDVLIII', 'MMXDVIII', 'MMVDIII'],
 485          2499 => ['MMLDVLIV', 'MMXDIX', 'MMVDIV', 'MMID'],
 486          2545 => ['MMDVL'],
 487          2546 => ['MMDVLI'],
 488          2547 => ['MMDVLII'],
 489          2548 => ['MMDVLIII'],
 490          2549 => ['MMDVLIV', 'MMDIL'],
 491          2595 => ['MMDVC'],
 492          2596 => ['MMDVCI'],
 493          2597 => ['MMDVCII'],
 494          2598 => ['MMDVCIII'],
 495          2599 => ['MMDVCIV', 'MMDIC'],
 496          2645 => ['MMDCVL'],
 497          2646 => ['MMDCVLI'],
 498          2647 => ['MMDCVLII'],
 499          2648 => ['MMDCVLIII'],
 500          2649 => ['MMDCVLIV', 'MMDCIL'],
 501          2695 => ['MMDCVC'],
 502          2696 => ['MMDCVCI'],
 503          2697 => ['MMDCVCII'],
 504          2698 => ['MMDCVCIII'],
 505          2699 => ['MMDCVCIV', 'MMDCIC'],
 506          2745 => ['MMDCCVL'],
 507          2746 => ['MMDCCVLI'],
 508          2747 => ['MMDCCVLII'],
 509          2748 => ['MMDCCVLIII'],
 510          2749 => ['MMDCCVLIV', 'MMDCCIL'],
 511          2795 => ['MMDCCVC'],
 512          2796 => ['MMDCCVCI'],
 513          2797 => ['MMDCCVCII'],
 514          2798 => ['MMDCCVCIII'],
 515          2799 => ['MMDCCVCIV', 'MMDCCIC'],
 516          2845 => ['MMDCCCVL'],
 517          2846 => ['MMDCCCVLI'],
 518          2847 => ['MMDCCCVLII'],
 519          2848 => ['MMDCCCVLIII'],
 520          2849 => ['MMDCCCVLIV', 'MMDCCCIL'],
 521          2895 => ['MMDCCCVC'],
 522          2896 => ['MMDCCCVCI'],
 523          2897 => ['MMDCCCVCII'],
 524          2898 => ['MMDCCCVCIII'],
 525          2899 => ['MMDCCCVCIV', 'MMDCCCIC'],
 526          2945 => ['MMCMVL'],
 527          2946 => ['MMCMVLI'],
 528          2947 => ['MMCMVLII'],
 529          2948 => ['MMCMVLIII'],
 530          2949 => ['MMCMVLIV', 'MMCMIL'],
 531          2950 => ['MMLM'],
 532          2951 => ['MMLMI'],
 533          2952 => ['MMLMII'],
 534          2953 => ['MMLMIII'],
 535          2954 => ['MMLMIV'],
 536          2955 => ['MMLMV'],
 537          2956 => ['MMLMVI'],
 538          2957 => ['MMLMVII'],
 539          2958 => ['MMLMVIII'],
 540          2959 => ['MMLMIX'],
 541          2960 => ['MMLMX'],
 542          2961 => ['MMLMXI'],
 543          2962 => ['MMLMXII'],
 544          2963 => ['MMLMXIII'],
 545          2964 => ['MMLMXIV'],
 546          2965 => ['MMLMXV'],
 547          2966 => ['MMLMXVI'],
 548          2967 => ['MMLMXVII'],
 549          2968 => ['MMLMXVIII'],
 550          2969 => ['MMLMXIX'],
 551          2970 => ['MMLMXX'],
 552          2971 => ['MMLMXXI'],
 553          2972 => ['MMLMXXII'],
 554          2973 => ['MMLMXXIII'],
 555          2974 => ['MMLMXXIV'],
 556          2975 => ['MMLMXXV'],
 557          2976 => ['MMLMXXVI'],
 558          2977 => ['MMLMXXVII'],
 559          2978 => ['MMLMXXVIII'],
 560          2979 => ['MMLMXXIX'],
 561          2980 => ['MMLMXXX'],
 562          2981 => ['MMLMXXXI'],
 563          2982 => ['MMLMXXXII'],
 564          2983 => ['MMLMXXXIII'],
 565          2984 => ['MMLMXXXIV'],
 566          2985 => ['MMLMXXXV'],
 567          2986 => ['MMLMXXXVI'],
 568          2987 => ['MMLMXXXVII'],
 569          2988 => ['MMLMXXXVIII'],
 570          2989 => ['MMLMXXXIX'],
 571          2990 => ['MMLMXL', 'MMXM'],
 572          2991 => ['MMLMXLI', 'MMXMI'],
 573          2992 => ['MMLMXLII', 'MMXMII'],
 574          2993 => ['MMLMXLIII', 'MMXMIII'],
 575          2994 => ['MMLMXLIV', 'MMXMIV'],
 576          2995 => ['MMLMVL', 'MMXMV', 'MMVM'],
 577          2996 => ['MMLMVLI', 'MMXMVI', 'MMVMI'],
 578          2997 => ['MMLMVLII', 'MMXMVII', 'MMVMII'],
 579          2998 => ['MMLMVLIII', 'MMXMVIII', 'MMVMIII'],
 580          2999 => ['MMLMVLIV', 'MMXMIX', 'MMVMIV', 'MMIM'],
 581          3045 => ['MMMVL'],
 582          3046 => ['MMMVLI'],
 583          3047 => ['MMMVLII'],
 584          3048 => ['MMMVLIII'],
 585          3049 => ['MMMVLIV', 'MMMIL'],
 586          3095 => ['MMMVC'],
 587          3096 => ['MMMVCI'],
 588          3097 => ['MMMVCII'],
 589          3098 => ['MMMVCIII'],
 590          3099 => ['MMMVCIV', 'MMMIC'],
 591          3145 => ['MMMCVL'],
 592          3146 => ['MMMCVLI'],
 593          3147 => ['MMMCVLII'],
 594          3148 => ['MMMCVLIII'],
 595          3149 => ['MMMCVLIV', 'MMMCIL'],
 596          3195 => ['MMMCVC'],
 597          3196 => ['MMMCVCI'],
 598          3197 => ['MMMCVCII'],
 599          3198 => ['MMMCVCIII'],
 600          3199 => ['MMMCVCIV', 'MMMCIC'],
 601          3245 => ['MMMCCVL'],
 602          3246 => ['MMMCCVLI'],
 603          3247 => ['MMMCCVLII'],
 604          3248 => ['MMMCCVLIII'],
 605          3249 => ['MMMCCVLIV', 'MMMCCIL'],
 606          3295 => ['MMMCCVC'],
 607          3296 => ['MMMCCVCI'],
 608          3297 => ['MMMCCVCII'],
 609          3298 => ['MMMCCVCIII'],
 610          3299 => ['MMMCCVCIV', 'MMMCCIC'],
 611          3345 => ['MMMCCCVL'],
 612          3346 => ['MMMCCCVLI'],
 613          3347 => ['MMMCCCVLII'],
 614          3348 => ['MMMCCCVLIII'],
 615          3349 => ['MMMCCCVLIV', 'MMMCCCIL'],
 616          3395 => ['MMMCCCVC'],
 617          3396 => ['MMMCCCVCI'],
 618          3397 => ['MMMCCCVCII'],
 619          3398 => ['MMMCCCVCIII'],
 620          3399 => ['MMMCCCVCIV', 'MMMCCCIC'],
 621          3445 => ['MMMCDVL'],
 622          3446 => ['MMMCDVLI'],
 623          3447 => ['MMMCDVLII'],
 624          3448 => ['MMMCDVLIII'],
 625          3449 => ['MMMCDVLIV', 'MMMCDIL'],
 626          3450 => ['MMMLD'],
 627          3451 => ['MMMLDI'],
 628          3452 => ['MMMLDII'],
 629          3453 => ['MMMLDIII'],
 630          3454 => ['MMMLDIV'],
 631          3455 => ['MMMLDV'],
 632          3456 => ['MMMLDVI'],
 633          3457 => ['MMMLDVII'],
 634          3458 => ['MMMLDVIII'],
 635          3459 => ['MMMLDIX'],
 636          3460 => ['MMMLDX'],
 637          3461 => ['MMMLDXI'],
 638          3462 => ['MMMLDXII'],
 639          3463 => ['MMMLDXIII'],
 640          3464 => ['MMMLDXIV'],
 641          3465 => ['MMMLDXV'],
 642          3466 => ['MMMLDXVI'],
 643          3467 => ['MMMLDXVII'],
 644          3468 => ['MMMLDXVIII'],
 645          3469 => ['MMMLDXIX'],
 646          3470 => ['MMMLDXX'],
 647          3471 => ['MMMLDXXI'],
 648          3472 => ['MMMLDXXII'],
 649          3473 => ['MMMLDXXIII'],
 650          3474 => ['MMMLDXXIV'],
 651          3475 => ['MMMLDXXV'],
 652          3476 => ['MMMLDXXVI'],
 653          3477 => ['MMMLDXXVII'],
 654          3478 => ['MMMLDXXVIII'],
 655          3479 => ['MMMLDXXIX'],
 656          3480 => ['MMMLDXXX'],
 657          3481 => ['MMMLDXXXI'],
 658          3482 => ['MMMLDXXXII'],
 659          3483 => ['MMMLDXXXIII'],
 660          3484 => ['MMMLDXXXIV'],
 661          3485 => ['MMMLDXXXV'],
 662          3486 => ['MMMLDXXXVI'],
 663          3487 => ['MMMLDXXXVII'],
 664          3488 => ['MMMLDXXXVIII'],
 665          3489 => ['MMMLDXXXIX'],
 666          3490 => ['MMMLDXL', 'MMMXD'],
 667          3491 => ['MMMLDXLI', 'MMMXDI'],
 668          3492 => ['MMMLDXLII', 'MMMXDII'],
 669          3493 => ['MMMLDXLIII', 'MMMXDIII'],
 670          3494 => ['MMMLDXLIV', 'MMMXDIV'],
 671          3495 => ['MMMLDVL', 'MMMXDV', 'MMMVD'],
 672          3496 => ['MMMLDVLI', 'MMMXDVI', 'MMMVDI'],
 673          3497 => ['MMMLDVLII', 'MMMXDVII', 'MMMVDII'],
 674          3498 => ['MMMLDVLIII', 'MMMXDVIII', 'MMMVDIII'],
 675          3499 => ['MMMLDVLIV', 'MMMXDIX', 'MMMVDIV', 'MMMID'],
 676          3545 => ['MMMDVL'],
 677          3546 => ['MMMDVLI'],
 678          3547 => ['MMMDVLII'],
 679          3548 => ['MMMDVLIII'],
 680          3549 => ['MMMDVLIV', 'MMMDIL'],
 681          3595 => ['MMMDVC'],
 682          3596 => ['MMMDVCI'],
 683          3597 => ['MMMDVCII'],
 684          3598 => ['MMMDVCIII'],
 685          3599 => ['MMMDVCIV', 'MMMDIC'],
 686          3645 => ['MMMDCVL'],
 687          3646 => ['MMMDCVLI'],
 688          3647 => ['MMMDCVLII'],
 689          3648 => ['MMMDCVLIII'],
 690          3649 => ['MMMDCVLIV', 'MMMDCIL'],
 691          3695 => ['MMMDCVC'],
 692          3696 => ['MMMDCVCI'],
 693          3697 => ['MMMDCVCII'],
 694          3698 => ['MMMDCVCIII'],
 695          3699 => ['MMMDCVCIV', 'MMMDCIC'],
 696          3745 => ['MMMDCCVL'],
 697          3746 => ['MMMDCCVLI'],
 698          3747 => ['MMMDCCVLII'],
 699          3748 => ['MMMDCCVLIII'],
 700          3749 => ['MMMDCCVLIV', 'MMMDCCIL'],
 701          3795 => ['MMMDCCVC'],
 702          3796 => ['MMMDCCVCI'],
 703          3797 => ['MMMDCCVCII'],
 704          3798 => ['MMMDCCVCIII'],
 705          3799 => ['MMMDCCVCIV', 'MMMDCCIC'],
 706          3845 => ['MMMDCCCVL'],
 707          3846 => ['MMMDCCCVLI'],
 708          3847 => ['MMMDCCCVLII'],
 709          3848 => ['MMMDCCCVLIII'],
 710          3849 => ['MMMDCCCVLIV', 'MMMDCCCIL'],
 711          3895 => ['MMMDCCCVC'],
 712          3896 => ['MMMDCCCVCI'],
 713          3897 => ['MMMDCCCVCII'],
 714          3898 => ['MMMDCCCVCIII'],
 715          3899 => ['MMMDCCCVCIV', 'MMMDCCCIC'],
 716          3945 => ['MMMCMVL'],
 717          3946 => ['MMMCMVLI'],
 718          3947 => ['MMMCMVLII'],
 719          3948 => ['MMMCMVLIII'],
 720          3949 => ['MMMCMVLIV', 'MMMCMIL'],
 721          3950 => ['MMMLM'],
 722          3951 => ['MMMLMI'],
 723          3952 => ['MMMLMII'],
 724          3953 => ['MMMLMIII'],
 725          3954 => ['MMMLMIV'],
 726          3955 => ['MMMLMV'],
 727          3956 => ['MMMLMVI'],
 728          3957 => ['MMMLMVII'],
 729          3958 => ['MMMLMVIII'],
 730          3959 => ['MMMLMIX'],
 731          3960 => ['MMMLMX'],
 732          3961 => ['MMMLMXI'],
 733          3962 => ['MMMLMXII'],
 734          3963 => ['MMMLMXIII'],
 735          3964 => ['MMMLMXIV'],
 736          3965 => ['MMMLMXV'],
 737          3966 => ['MMMLMXVI'],
 738          3967 => ['MMMLMXVII'],
 739          3968 => ['MMMLMXVIII'],
 740          3969 => ['MMMLMXIX'],
 741          3970 => ['MMMLMXX'],
 742          3971 => ['MMMLMXXI'],
 743          3972 => ['MMMLMXXII'],
 744          3973 => ['MMMLMXXIII'],
 745          3974 => ['MMMLMXXIV'],
 746          3975 => ['MMMLMXXV'],
 747          3976 => ['MMMLMXXVI'],
 748          3977 => ['MMMLMXXVII'],
 749          3978 => ['MMMLMXXVIII'],
 750          3979 => ['MMMLMXXIX'],
 751          3980 => ['MMMLMXXX'],
 752          3981 => ['MMMLMXXXI'],
 753          3982 => ['MMMLMXXXII'],
 754          3983 => ['MMMLMXXXIII'],
 755          3984 => ['MMMLMXXXIV'],
 756          3985 => ['MMMLMXXXV'],
 757          3986 => ['MMMLMXXXVI'],
 758          3987 => ['MMMLMXXXVII'],
 759          3988 => ['MMMLMXXXVIII'],
 760          3989 => ['MMMLMXXXIX'],
 761          3990 => ['MMMLMXL', 'MMMXM'],
 762          3991 => ['MMMLMXLI', 'MMMXMI'],
 763          3992 => ['MMMLMXLII', 'MMMXMII'],
 764          3993 => ['MMMLMXLIII', 'MMMXMIII'],
 765          3994 => ['MMMLMXLIV', 'MMMXMIV'],
 766          3995 => ['MMMLMVL', 'MMMXMV', 'MMMVM'],
 767          3996 => ['MMMLMVLI', 'MMMXMVI', 'MMMVMI'],
 768          3997 => ['MMMLMVLII', 'MMMXMVII', 'MMMVMII'],
 769          3998 => ['MMMLMVLIII', 'MMMXMVIII', 'MMMVMIII'],
 770          3999 => ['MMMLMVLIV', 'MMMXMIX', 'MMMVMIV', 'MMMIM'],
 771      ];
 772  
 773      private const THOUSANDS = ['', 'M', 'MM', 'MMM'];
 774      private const HUNDREDS = ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM'];
 775      private const TENS = ['', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'];
 776      private const ONES = ['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'];
 777      const MAX_ROMAN_VALUE = 3999;
 778      const MAX_ROMAN_STYLE = 4;
 779  
 780      private static function valueOk(int $aValue, int $style): string
 781      {
 782          $origValue = $aValue;
 783          $m = \intdiv($aValue, 1000);
 784          $aValue %= 1000;
 785          $c = \intdiv($aValue, 100);
 786          $aValue %= 100;
 787          $t = \intdiv($aValue, 10);
 788          $aValue %= 10;
 789          $result = self::THOUSANDS[$m] . self::HUNDREDS[$c] . self::TENS[$t] . self::ONES[$aValue];
 790          if ($style > 0) {
 791              if (array_key_exists($origValue, self::VALUES)) {
 792                  $arr = self::VALUES[$origValue];
 793                  $idx = min($style, count($arr)) - 1;
 794                  $result = $arr[$idx];
 795              }
 796          }
 797  
 798          return $result;
 799      }
 800  
 801      private static function styleOk(int $aValue, int $style): string
 802      {
 803          return ($aValue < 0 || $aValue > self::MAX_ROMAN_VALUE) ? Functions::VALUE() : self::valueOk($aValue, $style);
 804      }
 805  
 806      public static function calculateRoman(int $aValue, int $style): string
 807      {
 808          return ($style < 0 || $style > self::MAX_ROMAN_STYLE) ? Functions::VALUE() : self::styleOk($aValue, $style);
 809      }
 810  
 811      /**
 812       * ROMAN.
 813       *
 814       * Converts a number to Roman numeral
 815       *
 816       * @param mixed $aValue Number to convert
 817       * @param mixed $style Number indicating one of five possible forms
 818       *
 819       * @return string Roman numeral, or a string containing an error
 820       */
 821      public static function evaluate($aValue, $style = 0)
 822      {
 823          try {
 824              $aValue = Helpers::validateNumericNullBool($aValue);
 825              if (is_bool($style)) {
 826                  $style = $style ? 0 : 4;
 827              }
 828              $style = Helpers::validateNumericNullSubstitution($style, null);
 829          } catch (Exception $e) {
 830              return $e->getMessage();
 831          }
 832  
 833          return self::calculateRoman((int) $aValue, (int) $style);
 834      }
 835  }