Added support for the ARABIC excel function (#1343)
Updated changelog Updated docprops Fixed stylci
This commit is contained in:
parent
14d807c2c4
commit
25e3e45eb6
|
@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org).
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
- Added support for the ARABIC function
|
||||||
- Conditionals - Extend Support for (NOT)CONTAINSBLANKS [#1278](https://github.com/PHPOffice/PhpSpreadsheet/pull/1278)
|
- Conditionals - Extend Support for (NOT)CONTAINSBLANKS [#1278](https://github.com/PHPOffice/PhpSpreadsheet/pull/1278)
|
||||||
- Handle Error in Formula Processing Better for Xls [#1267](https://github.com/PHPOffice/PhpSpreadsheet/pull/1267)
|
- Handle Error in Formula Processing Better for Xls [#1267](https://github.com/PHPOffice/PhpSpreadsheet/pull/1267)
|
||||||
- Handle ConditionalStyle NumberFormat When Reading Xlsx File [#1296](https://github.com/PHPOffice/PhpSpreadsheet/pull/1296)
|
- Handle ConditionalStyle NumberFormat When Reading Xlsx File [#1296](https://github.com/PHPOffice/PhpSpreadsheet/pull/1296)
|
||||||
|
|
|
@ -263,6 +263,11 @@ class Calculation
|
||||||
'functionCall' => [Logical::class, 'logicalAnd'],
|
'functionCall' => [Logical::class, 'logicalAnd'],
|
||||||
'argumentCount' => '1+',
|
'argumentCount' => '1+',
|
||||||
],
|
],
|
||||||
|
'ARABIC' => [
|
||||||
|
'category' => Category::CATEGORY_MATH_AND_TRIG,
|
||||||
|
'functionCall' => [MathTrig::class, 'ARABIC'],
|
||||||
|
'argumentCount' => '1',
|
||||||
|
],
|
||||||
'AREAS' => [
|
'AREAS' => [
|
||||||
'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE,
|
'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE,
|
||||||
'functionCall' => [Functions::class, 'DUMMY'],
|
'functionCall' => [Functions::class, 'DUMMY'],
|
||||||
|
|
|
@ -38,6 +38,64 @@ class MathTrig
|
||||||
return ($num - ($num % $n)) / $n;
|
return ($num - ($num % $n)) / $n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ARABIC.
|
||||||
|
*
|
||||||
|
* Converts a Roman numeral to an Arabic numeral.
|
||||||
|
*
|
||||||
|
* Excel Function:
|
||||||
|
* ARABIC(text)
|
||||||
|
*
|
||||||
|
* @category Mathematical and Trigonometric Functions
|
||||||
|
*
|
||||||
|
* @param string $roman
|
||||||
|
*
|
||||||
|
* @return int|string the arabic numberal contrived from the roman numeral
|
||||||
|
*/
|
||||||
|
public static function ARABIC($roman)
|
||||||
|
{
|
||||||
|
// An empty string should return 0
|
||||||
|
$roman = substr(trim(strtoupper((string) Functions::flattenSingleValue($roman))), 0, 255);
|
||||||
|
if ($roman === '') {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert the roman numeral to an arabic number
|
||||||
|
$lookup = [
|
||||||
|
'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,
|
||||||
|
];
|
||||||
|
|
||||||
|
$negativeNumber = $roman[0] === '-';
|
||||||
|
if ($negativeNumber) {
|
||||||
|
$roman = substr($roman, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$arabic = 0;
|
||||||
|
for ($i = 0; $i < strlen($roman); ++$i) {
|
||||||
|
if (!isset($lookup[$roman[$i]])) {
|
||||||
|
return Functions::VALUE(); // Invalid character detected
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($i < (strlen($roman) - 1) && isset($lookup[substr($roman, $i, 2)])) {
|
||||||
|
$arabic += $lookup[substr($roman, $i, 2)]; // Detected a match on the next 2 characters
|
||||||
|
++$i;
|
||||||
|
} else {
|
||||||
|
$arabic += $lookup[$roman[$i]]; // Detected a match on one character only
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($negativeNumber) {
|
||||||
|
$arabic *= -1; // The number should be negative
|
||||||
|
}
|
||||||
|
|
||||||
|
return $arabic;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ATAN2.
|
* ATAN2.
|
||||||
*
|
*
|
||||||
|
|
|
@ -9,6 +9,7 @@ ADDRESS
|
||||||
AMORDEGRC
|
AMORDEGRC
|
||||||
AMORLINC
|
AMORLINC
|
||||||
AND
|
AND
|
||||||
|
ARABIC
|
||||||
AREAS
|
AREAS
|
||||||
ASC
|
ASC
|
||||||
ASIN
|
ASIN
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\MathTrig;
|
||||||
|
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Calculation\MathTrig;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
class ArabicTest extends TestCase
|
||||||
|
{
|
||||||
|
public function setUp()
|
||||||
|
{
|
||||||
|
Functions::setCompatibilityMode(Functions::COMPATIBILITY_EXCEL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider providerARABIC
|
||||||
|
*
|
||||||
|
* @param mixed $expectedResult
|
||||||
|
* @param string $romanNumeral
|
||||||
|
*/
|
||||||
|
public function testARABIC($expectedResult, $romanNumeral)
|
||||||
|
{
|
||||||
|
$result = MathTrig::ARABIC($romanNumeral);
|
||||||
|
$this->assertEquals($expectedResult, $result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function providerARABIC()
|
||||||
|
{
|
||||||
|
return require 'data/Calculation/MathTrig/ARABIC.php';
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
return [
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
' ',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
49,
|
||||||
|
'XLIX',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
50,
|
||||||
|
'L',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2012,
|
||||||
|
'MMXII',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
999,
|
||||||
|
'CMXCIX',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
499,
|
||||||
|
'CDXCIX',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2018,
|
||||||
|
'MMXVIII',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
-2018,
|
||||||
|
'-MMXVIII',
|
||||||
|
],
|
||||||
|
];
|
Loading…
Reference in New Issue