Skip to content

Commit

Permalink
Implement Excel VALUE() function, locale-warts and all
Browse files Browse the repository at this point in the history
  • Loading branch information
MarkBaker committed Aug 29, 2014
1 parent ba1e16d commit 280620a
Show file tree
Hide file tree
Showing 6 changed files with 76 additions and 5 deletions.
2 changes: 1 addition & 1 deletion Classes/PHPExcel/Calculation.php
Original file line number Diff line number Diff line change
Expand Up @@ -1628,7 +1628,7 @@ class PHPExcel_Calculation {
'argumentCount' => '2'
),
'VALUE' => array('category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA,
'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY',
'functionCall' => 'PHPExcel_Calculation_TextData::VALUE',
'argumentCount' => '1'
),
'VAR' => array('category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL,
Expand Down
45 changes: 43 additions & 2 deletions Classes/PHPExcel/Calculation/TextData.php
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ public static function TRIMNONPRINTABLE($stringValue = '') {
}

if (is_string($stringValue) || is_numeric($stringValue)) {
return str_replace(self::$_invalidChars,'',trim($stringValue,"\x00..\x1F"));
return str_replace(self::$_invalidChars, '', trim($stringValue, "\x00..\x1F"));
}
return NULL;
} // function TRIMNONPRINTABLE()
Expand Down Expand Up @@ -587,4 +587,45 @@ public static function TEXTFORMAT($value,$format) {
return (string) PHPExcel_Style_NumberFormat::toFormattedString($value,$format);
} // function TEXTFORMAT()

} // class PHPExcel_Calculation_TextData
/**
* VALUE
*
* @param mixed $value Value to check
* @return boolean
*/
public static function VALUE($value = '') {
$value = PHPExcel_Calculation_Functions::flattenSingleValue($value);

if (!is_numeric($value)) {
$numberValue = str_replace(
PHPExcel_Shared_String::getThousandsSeparator(),
'',
trim($value, " \t\n\r\0\x0B" . PHPExcel_Shared_String::getCurrencyCode())
);
if (is_numeric($numberValue)) {
return (float) $numberValue;
}

$dateSetting = PHPExcel_Calculation_Functions::getReturnDateType();
PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL);

if (strpos($value, ':') !== false) {
$timeValue = PHPExcel_Calculation_DateTime::TIMEVALUE($value);
if ($timeValue !== PHPExcel_Calculation_Functions::VALUE()) {
PHPExcel_Calculation_Functions::setReturnDateType($dateSetting);
return $timeValue;
}
}
$dateValue = PHPExcel_Calculation_DateTime::DATEVALUE($value);
if ($dateValue !== PHPExcel_Calculation_Functions::VALUE()) {
PHPExcel_Calculation_Functions::setReturnDateType($dateSetting);
return $dateValue;
}
PHPExcel_Calculation_Functions::setReturnDateType($dateSetting);

return PHPExcel_Calculation_Functions::VALUE();
}
return (float) $value;
}

}
2 changes: 1 addition & 1 deletion Documentation/FunctionListByCategory.txt
Original file line number Diff line number Diff line change
Expand Up @@ -374,4 +374,4 @@ CATEGORY_TEXT_AND_DATA
TEXT PHPExcel_Calculation_TextData::TEXTFORMAT
TRIM PHPExcel_Calculation_TextData::TRIMSPACES
UPPER PHPExcel_Calculation_TextData::UPPERCASE
VALUE *** Not yet Implemented
VALUE PHPExcel_Calculation_TextData::VALUE
2 changes: 1 addition & 1 deletion Documentation/FunctionListByName.txt
Original file line number Diff line number Diff line change
Expand Up @@ -355,7 +355,7 @@ TYPE CATEGORY_INFORMATION PHPExcel_Calculation_Fun
UPPER CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::UPPERCASE
USDOLLAR CATEGORY_FINANCIAL *** Not yet Implemented

VALUE CATEGORY_TEXT_AND_DATA *** Not yet Implemented
VALUE CATEGORY_TEXT_AND_DATA PHPExcel_Calculation_TextData::VALUE
VAR CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::VARFunc
VARA CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::VARA
VARP CATEGORY_STATISTICAL PHPExcel_Calculation_Statistical::VARP
Expand Down
20 changes: 20 additions & 0 deletions unitTests/Classes/PHPExcel/Calculation/TextDataTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -340,4 +340,24 @@ public function providerTEXT()
return new testDataFileIterator('rawTestData/Calculation/TextData/TEXT.data');
}

/**
* @dataProvider providerVALUE
*/
public function testVALUE()
{
call_user_func(array('PHPExcel_Shared_String','setDecimalSeparator'),'.');
call_user_func(array('PHPExcel_Shared_String','setThousandsSeparator'),' ');
call_user_func(array('PHPExcel_Shared_String','setCurrencyCode'),'$');

$args = func_get_args();
$expectedResult = array_pop($args);
$result = call_user_func_array(array('PHPExcel_Calculation_TextData','VALUE'),$args);
$this->assertEquals($expectedResult, $result, NULL, 1E-8);
}

public function providerVALUE()
{
return new testDataFileIterator('rawTestData/Calculation/TextData/VALUE.data');
}

}
10 changes: 10 additions & 0 deletions unitTests/rawTestData/Calculation/TextData/VALUE.data
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
"1000", "1000"
"1 000", "1000"
"$1 000", "1000"
"£1 000", "#VALUE!"
"1.1", "1.1"
"1 000.1", "1000.1"
"13 Monkeys", "#VALUE!"
"1-Jan-2014", "41640"
"12:34:56", "0.524259259259259"
"2:46 AM", "0.11527777777778"

0 comments on commit 280620a

Please sign in to comment.