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.
<?php

namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig;

> use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled;
use PhpOffice\PhpSpreadsheet\Calculation\Exception;
< use PhpOffice\PhpSpreadsheet\Calculation\Functions;
> use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
class Arabic {
> use ArrayEnabled; private const ROMAN_LOOKUP = [ >
'M' => 1000, 'D' => 500, 'C' => 100, 'L' => 50, 'X' => 10, 'V' => 5, 'I' => 1, ]; /** * Recursively calculate the arabic value of a roman numeral. * * @param int $sum * @param int $subtract * * @return int */ private static function calculateArabic(array $roman, &$sum = 0, $subtract = 0) { $numeral = array_shift($roman); if (!isset(self::ROMAN_LOOKUP[$numeral])) { throw new Exception('Invalid character detected'); } $arabic = self::ROMAN_LOOKUP[$numeral]; if (count($roman) > 0 && isset(self::ROMAN_LOOKUP[$roman[0]]) && $arabic < self::ROMAN_LOOKUP[$roman[0]]) { $subtract += $arabic; } else { $sum += ($arabic - $subtract); $subtract = 0; } if (count($roman) > 0) { self::calculateArabic($roman, $sum, $subtract); } return $sum; } /** * @param mixed $value */ private static function mollifyScrutinizer($value): array { return is_array($value) ? $value : []; } private static function strSplit(string $roman): array { $rslt = str_split($roman); return self::mollifyScrutinizer($rslt); } /** * ARABIC. * * Converts a Roman numeral to an Arabic numeral. * * Excel Function: * ARABIC(text) *
< * @param string $roman
> * @param mixed $roman Should be a string, or can be an array of strings
*
< * @return int|string the arabic numberal contrived from the roman numeral
> * @return array|int|string the arabic numberal contrived from the roman numeral > * If an array of numbers is passed as the argument, then the returned result will also be an array > * with the same dimensions
*/ public static function evaluate($roman) {
> if (is_array($roman)) { // An empty string should return 0 > return self::evaluateSingleArgumentArray([self::class, __FUNCTION__], $roman); $roman = substr(trim(strtoupper((string) Functions::flattenSingleValue($roman))), 0, 255); > } if ($roman === '') { >
< $roman = substr(trim(strtoupper((string) Functions::flattenSingleValue($roman))), 0, 255);
> $roman = substr(trim(strtoupper((string) $roman)), 0, 255);
} // Convert the roman numeral to an arabic number $negativeNumber = $roman[0] === '-'; if ($negativeNumber) { $roman = substr($roman, 1); } try { $arabic = self::calculateArabic(self::strSplit($roman)); } catch (Exception $e) {
< return Functions::VALUE(); // Invalid character detected
> return ExcelError::VALUE(); // Invalid character detected
} if ($negativeNumber) { $arabic *= -1; // The number should be negative } return $arabic; } }