Skip to content

Commit 280620a

Browse files
author
MarkBaker
committed
Implement Excel VALUE() function, locale-warts and all
1 parent ba1e16d commit 280620a

File tree

6 files changed

+76
-5
lines changed

6 files changed

+76
-5
lines changed

Classes/PHPExcel/Calculation.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1628,7 +1628,7 @@ class PHPExcel_Calculation {
16281628
'argumentCount' => '2'
16291629
),
16301630
'VALUE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,
1631-
'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',
1631+
'functionCall' => 'PHPExcel_Calculation_TextData::VALUE',
16321632
'argumentCount' => '1'
16331633
),
16341634
'VAR' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,

Classes/PHPExcel/Calculation/TextData.php

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public static function TRIMNONPRINTABLE($stringValue = '') {
104104
}
105105

106106
if (is_string($stringValue) || is_numeric($stringValue)) {
107-
return str_replace(self::$_invalidChars,'',trim($stringValue,"\x00..\x1F"));
107+
return str_replace(self::$_invalidChars, '', trim($stringValue, "\x00..\x1F"));
108108
}
109109
return NULL;
110110
} // function TRIMNONPRINTABLE()
@@ -587,4 +587,45 @@ public static function TEXTFORMAT($value,$format) {
587587
return (string) PHPExcel_Style_NumberFormat::toFormattedString($value,$format);
588588
} // function TEXTFORMAT()
589589

590-
} // class PHPExcel_Calculation_TextData
590+
/**
591+
* VALUE
592+
*
593+
* @param mixed $value Value to check
594+
* @return boolean
595+
*/
596+
public static function VALUE($value = '') {
597+
$value = PHPExcel_Calculation_Functions::flattenSingleValue($value);
598+
599+
if (!is_numeric($value)) {
600+
$numberValue = str_replace(
601+
PHPExcel_Shared_String::getThousandsSeparator(),
602+
'',
603+
trim($value, " \t\n\r\0\x0B" . PHPExcel_Shared_String::getCurrencyCode())
604+
);
605+
if (is_numeric($numberValue)) {
606+
return (float) $numberValue;
607+
}
608+
609+
$dateSetting = PHPExcel_Calculation_Functions::getReturnDateType();
610+
PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL);
611+
612+
if (strpos($value, ':') !== false) {
613+
$timeValue = PHPExcel_Calculation_DateTime::TIMEVALUE($value);
614+
if ($timeValue !== PHPExcel_Calculation_Functions::VALUE()) {
615+
PHPExcel_Calculation_Functions::setReturnDateType($dateSetting);
616+
return $timeValue;
617+
}
618+
}
619+
$dateValue = PHPExcel_Calculation_DateTime::DATEVALUE($value);
620+
if ($dateValue !== PHPExcel_Calculation_Functions::VALUE()) {
621+
PHPExcel_Calculation_Functions::setReturnDateType($dateSetting);
622+
return $dateValue;
623+
}
624+
PHPExcel_Calculation_Functions::setReturnDateType($dateSetting);
625+
626+
return PHPExcel_Calculation_Functions::VALUE();
627+
}
628+
return (float) $value;
629+
}
630+
631+
}

Documentation/FunctionListByCategory.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,4 +374,4 @@ CATEGORY_TEXT_AND_DATA
374374
TEXT PHPExcel_Calculation_TextData::TEXTFORMAT
375375
TRIM PHPExcel_Calculation_TextData::TRIMSPACES
376376
UPPER PHPExcel_Calculation_TextData::UPPERCASE
377-
VALUE *** Not yet Implemented
377+
VALUE PHPExcel_Calculation_TextData::VALUE

Documentation/FunctionListByName.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ TYPE CATEGORY_INFORMATION PHPExcel_Calculation_Fun
355355
UPPER CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::UPPERCASE
356356
USDOLLAR CATEGORY_FINANCIAL *** Not yet Implemented
357357

358-
VALUE CATEGORY_TEXT_AND_DATA *** Not yet Implemented
358+
VALUE CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::VALUE
359359
VAR CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::VARFunc
360360
VARA CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::VARA
361361
VARP CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::VARP

unitTests/Classes/PHPExcel/Calculation/TextDataTest.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,4 +340,24 @@ public function providerTEXT()
340340
return new testDataFileIterator('rawTestData/Calculation/TextData/TEXT.data');
341341
}
342342

343+
/**
344+
* @dataProvider providerVALUE
345+
*/
346+
public function testVALUE()
347+
{
348+
call_user_func(array('PHPExcel_Shared_String','setDecimalSeparator'),'.');
349+
call_user_func(array('PHPExcel_Shared_String','setThousandsSeparator'),' ');
350+
call_user_func(array('PHPExcel_Shared_String','setCurrencyCode'),'$');
351+
352+
$args = func_get_args();
353+
$expectedResult = array_pop($args);
354+
$result = call_user_func_array(array('PHPExcel_Calculation_TextData','VALUE'),$args);
355+
$this->assertEquals($expectedResult, $result, NULL, 1E-8);
356+
}
357+
358+
public function providerVALUE()
359+
{
360+
return new testDataFileIterator('rawTestData/Calculation/TextData/VALUE.data');
361+
}
362+
343363
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
"1000", "1000"
2+
"1 000", "1000"
3+
"$1 000", "1000"
4+
"£1 000", "#VALUE!"
5+
"1.1", "1.1"
6+
"1 000.1", "1000.1"
7+
"13 Monkeys", "#VALUE!"
8+
"1-Jan-2014", "41640"
9+
"12:34:56", "0.524259259259259"
10+
"2:46 AM", "0.11527777777778"

0 commit comments

Comments
 (0)