Skip to content
This repository has been archived by the owner on Jan 2, 2019. It is now read-only.

Commit

Permalink
Improved AdvancedValueBinder for currency.
Browse files Browse the repository at this point in the history
  • Loading branch information
kea committed Oct 25, 2012
1 parent 701ff5a commit d1f172d
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 2 deletions.
6 changes: 4 additions & 2 deletions Classes/PHPExcel/Cell/AdvancedValueBinder.php
Original file line number Diff line number Diff line change
Expand Up @@ -113,9 +113,11 @@ public function bindValue(PHPExcel_Cell $cell, $value = null)

// 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() )
Expand Down
61 changes: 61 additions & 0 deletions unitTests/Classes/PHPExcel/Cell/AdvancedValueBinderTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<?php

class AdvancedValueBinderTest extends PHPUnit_Framework_TestCase
{
public function setUp()
{
if (!defined('PHPEXCEL_ROOT')) {
define('PHPEXCEL_ROOT', APPLICATION_PATH . '/');
}
require_once(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');
}

public function provider()
{
if (!class_exists('PHPExcel_Style_NumberFormat')) {
$this->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());
}
}

0 comments on commit d1f172d

Please sign in to comment.