TextData Coverage and Minor Bug Fixes (#1744)

This had been intended to get 100% coverage for TextData functions, and it does that.
However, some minor bugs requiring source changes arose during testing.
- the Excel CHAR function restricts its argument to 1-255. PhpSpreadsheet CHARACTER
  had been allowing 0+. Also, there is no need to test if iconv exists,
  since it is part of Composer requirements.
- The DOLLAR function had been returning NUM for invalid arguments. Excel returns VALUE.
  Also, negative amounts were not being handled correctly.
- The FIXEDFORMAT function had been returning NUM for invalid arguments. Excel FIXED returns VALUE.
This commit is contained in:
oleibman 2020-12-10 09:35:26 -08:00 committed by GitHub
parent 78774d6ac8
commit 957cb62dab
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 82 additions and 18 deletions

View File

@ -27,15 +27,15 @@ class TextData
{ {
$character = Functions::flattenSingleValue($character); $character = Functions::flattenSingleValue($character);
if ((!is_numeric($character)) || ($character < 0)) { if (!is_numeric($character)) {
return Functions::VALUE();
}
$character = (int) $character;
if ($character < 1 || $character > 255) {
return Functions::VALUE(); return Functions::VALUE();
} }
if (function_exists('iconv')) { return iconv('UCS-4LE', 'UTF-8', pack('V', $character));
return iconv('UCS-4LE', 'UTF-8', pack('V', $character));
}
return mb_convert_encoding('&#' . (int) $character . ';', 'UTF-8', 'HTML-ENTITIES');
} }
/** /**
@ -160,7 +160,7 @@ class TextData
// Validate parameters // Validate parameters
if (!is_numeric($value) || !is_numeric($decimals)) { if (!is_numeric($value) || !is_numeric($decimals)) {
return Functions::NAN(); return Functions::VALUE();
} }
$decimals = floor($decimals); $decimals = floor($decimals);
@ -174,6 +174,7 @@ class TextData
} }
$value = MathTrig::MROUND($value, $round); $value = MathTrig::MROUND($value, $round);
} }
$mask = "$mask;($mask)";
return NumberFormat::toFormattedString($value, $mask); return NumberFormat::toFormattedString($value, $mask);
} }
@ -265,7 +266,7 @@ class TextData
// Validate parameters // Validate parameters
if (!is_numeric($value) || !is_numeric($decimals)) { if (!is_numeric($value) || !is_numeric($decimals)) {
return Functions::NAN(); return Functions::VALUE();
} }
$decimals = (int) floor($decimals); $decimals = (int) floor($decimals);

View File

@ -9,6 +9,10 @@ return [
'#VALUE!', '#VALUE!',
-5, -5,
], ],
[
'#VALUE!',
0,
],
[ [
'A', 'A',
65, 65,
@ -22,27 +26,39 @@ return [
126, 126,
], ],
[ [
'⽇', 'Á',
193,
],
[
'ÿ',
255,
],
[
'#VALUE!',
256,
],
[
'#VALUE!', // '⽇',
12103, 12103,
], ],
[ [
'œ', '#VALUE!', // 'œ',
0x153, 0x153,
], ],
[ [
'ƒ', '#VALUE!', // 'ƒ',
0x192, 0x192,
], ],
[ [
'℅', '#VALUE!', // '℅',
0x2105, 0x2105,
], ],
[ [
'∑', '#VALUE!', // '∑',
0x2211, 0x2211,
], ],
[ [
'†', '#VALUE!', // '†',
0x2020, 0x2020,
], ],
]; ];

View File

@ -6,11 +6,20 @@ return [
123.456, 123.456,
2, 2,
], ],
[
'$123.46',
123.456,
],
[ [
'$123.32', '$123.32',
123.321, 123.321,
2, 2,
], ],
[
'($123.32)',
-123.321,
2,
],
[ [
'$1,235,000', '$1,235,000',
1234567, 1234567,
@ -22,12 +31,17 @@ return [
-5, -5,
], ],
[ [
'#NUM!', '($1,200,000)',
-1234567,
-5,
],
[
'#VALUE!',
'ABC', 'ABC',
2, 2,
], ],
[ [
'#NUM!', '#VALUE!',
123.456, 123.456,
'ABC', 'ABC',
], ],

View File

@ -20,13 +20,41 @@ return [
true, true,
], ],
[ [
'#NUM!', '-123456.79',
-123456.789,
2,
true,
],
[
'123500',
123456.789,
-2,
true,
],
[
'123,500',
123456.789,
-2,
],
[
'-123500',
-123456.789,
-2,
true,
],
[
'-123,500',
-123456.789,
-2,
],
[
'#VALUE!',
'ABC', 'ABC',
2, 2,
null, null,
], ],
[ [
'#NUM!', '#VALUE!',
123.456, 123.456,
'ABC', 'ABC',
null, null,

View File

@ -54,6 +54,11 @@ return [
'Mark Baker', 'Mark Baker',
2, 2,
], ],
[
1,
'',
'Mark Baker',
],
[ [
'#VALUE!', '#VALUE!',
'BITE', 'BITE',