From d1f172d8d6eed3b72c0d59e292be11e5738010c3 Mon Sep 17 00:00:00 2001 From: Manuel Kea Baldassarri Date: Thu, 25 Oct 2012 12:44:47 +0200 Subject: [PATCH] Improved AdvancedValueBinder for currency. --- Classes/PHPExcel/Cell/AdvancedValueBinder.php | 6 +- .../PHPExcel/Cell/AdvancedValueBinderTest.php | 61 +++++++++++++++++++ 2 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 unitTests/Classes/PHPExcel/Cell/AdvancedValueBinderTest.php diff --git a/Classes/PHPExcel/Cell/AdvancedValueBinder.php b/Classes/PHPExcel/Cell/AdvancedValueBinder.php index 7e176aef..50a07f96 100644 --- a/Classes/PHPExcel/Cell/AdvancedValueBinder.php +++ b/Classes/PHPExcel/Cell/AdvancedValueBinder.php @@ -113,9 +113,11 @@ class PHPExcel_Cell_AdvancedValueBinder extends PHPExcel_Cell_DefaultValueBinder // Check for currency $currencyCode = PHPExcel_Shared_String::getCurrencyCode(); - if (preg_match('/^'.preg_quote($currencyCode).' *(\d{1,3}(\,\d{3})*|(\d+))(\.\d{2})?$/', $value)) { + $decimalSeparator = PHPExcel_Shared_String::getDecimalSeparator(); + $thousandsSeparator = PHPExcel_Shared_String::getThousandsSeparator(); + if (preg_match('/^'.preg_quote($currencyCode).' *(\d{1,3}('.preg_quote($thousandsSeparator).'\d{3})*|(\d+))('.preg_quote($decimalSeparator).'\d{2})?$/', $value)) { // Convert value to number - $value = (float) trim(str_replace(array($currencyCode,','), '', $value)); + $value = (float) trim(str_replace(array($currencyCode, $thousandsSeparator, $decimalSeparator), array('', '', '.'), $value)); $cell->setValueExplicit( $value, PHPExcel_Cell_DataType::TYPE_NUMERIC); // Set style $cell->getParent()->getStyle( $cell->getCoordinate() ) diff --git a/unitTests/Classes/PHPExcel/Cell/AdvancedValueBinderTest.php b/unitTests/Classes/PHPExcel/Cell/AdvancedValueBinderTest.php new file mode 100644 index 00000000..a76a2b25 --- /dev/null +++ b/unitTests/Classes/PHPExcel/Cell/AdvancedValueBinderTest.php @@ -0,0 +1,61 @@ +setUp(); + } + $currencyUSD = PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_USD_SIMPLE; + $currencyEURO = str_replace('$', '€', PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_USD_SIMPLE); + + return array( + array('10%', 0.1, PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE_00, ',', '.', '$'), + array('$10.11', 10.11, $currencyUSD, ',', '.', '$'), + array('$1,010.12', 1010.12, $currencyUSD, ',', '.', '$'), + array('$20,20', 20.2, $currencyUSD, '.', ',', '$'), + array('$2.020,20', 2020.2, $currencyUSD, '.', ',', '$'), + array('€2.020,20', 2020.2, $currencyEURO, '.', ',', '€'), + array('€ 2.020,20', 2020.2, $currencyEURO, '.', ',', '€'), + array('€2,020.22', 2020.22, $currencyEURO, ',', '.', '€'), + ); + } + + /** + * @dataProvider provider + */ + public function testCurrency($value, $valueBinded, $format, $thousandsSeparator, $decimalSeparator, $currencyCode) + { + $sheet = $this->getMock('PHPExcel_Worksheet', array('getStyle', 'getNumberFormat', 'setFormatCode')); + + $sheet->expects($this->once()) + ->method('getStyle') + ->will($this->returnSelf()); + $sheet->expects($this->once()) + ->method('getNumberFormat') + ->will($this->returnSelf()); + $sheet->expects($this->once()) + ->method('setFormatCode') + ->with($format) + ->will($this->returnSelf()); + + PHPExcel_Shared_String::setCurrencyCode($currencyCode); + PHPExcel_Shared_String::setDecimalSeparator($decimalSeparator); + PHPExcel_Shared_String::setThousandsSeparator($thousandsSeparator); + + $cell = new PHPExcel_Cell('A', 1, null, PHPExcel_Cell_DataType::TYPE_STRING, $sheet); + + $binder = new PHPExcel_Cell_AdvancedValueBinder(); + $binder->bindValue($cell, $value); + $this->assertEquals($valueBinded, $cell->getValue()); + } +} \ No newline at end of file