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

Commit

Permalink
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 5 deletions.
43 changes: 41 additions & 2 deletions src/View/Helper/NumberFormat.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,13 @@ class NumberFormat extends AbstractHelper
*/
protected $formatType;

/**
* number of decimals to use.
*
* @var integer
*/
protected $decimals;

/**
* Formatter instances.
*
Expand Down Expand Up @@ -96,6 +103,28 @@ public function getFormatType()
return $this->formatType;
}

/**
* Set number of decimals to use instead of the default.
*
* @param integer $decimals
* @return NumberFormat
*/
public function setDecimals($decimals)
{
$this->decimals = $decimals;
return $this;
}

/**
* Get number of decimals.
*
* @return integer
*/
public function getDecimals()
{
return $this->decimals;
}

/**
* Set locale to use instead of the default.
*
Expand Down Expand Up @@ -129,13 +158,15 @@ public function getLocale()
* @param integer $formatStyle
* @param integer $formatType
* @param string $locale
* @param integer $decimals
* @return string
*/
public function __invoke(
$number,
$formatStyle = null,
$formatType = null,
$locale = null
$locale = null,
$decimals = null
) {
if (null === $locale) {
$locale = $this->getLocale();
Expand All @@ -146,14 +177,22 @@ public function __invoke(
if (null === $formatType) {
$formatType = $this->getFormatType();
}
if (!is_int($decimals) || $decimals < 0) {
$decimals = $this->getDecimals();
}

$formatterId = md5($formatStyle . "\0" . $locale);
$formatterId = md5($formatStyle . "\0" . $locale . "\0" . $decimals);

if (!isset($this->formatters[$formatterId])) {
$this->formatters[$formatterId] = new NumberFormatter(
$locale,
$formatStyle
);

if ($decimals !== null) {
$this->formatters[$formatterId]->setAttribute(NumberFormatter::MIN_FRACTION_DIGITS, $decimals);
$this->formatters[$formatterId]->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, $decimals);
}
}

return $this->formatters[$formatterId]->format($number, $formatType);
Expand Down
32 changes: 29 additions & 3 deletions test/View/Helper/NumberFormatTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -59,62 +59,87 @@ public function currencyTestsDataProvider()
'de_DE',
NumberFormatter::DECIMAL,
NumberFormatter::TYPE_DOUBLE,
null,
1234567.891234567890000,
'1.234.567,891'
),
array(
'de_DE',
NumberFormatter::DECIMAL,
NumberFormatter::TYPE_DOUBLE,
6,
1234567.891234567890000,
'1.234.567,891235',
),
array(
'de_DE',
NumberFormatter::PERCENT,
NumberFormatter::TYPE_DOUBLE,
null,
1234567.891234567890000,
'123.456.789 %'
),
array(
'de_DE',
NumberFormatter::PERCENT,
NumberFormatter::TYPE_DOUBLE,
1,
1234567.891234567890000,
'123.456.789,1 %'
),
array(
'de_DE',
NumberFormatter::SCIENTIFIC,
NumberFormatter::TYPE_DOUBLE,
null,
1234567.891234567890000,
'1,23456789123457E6'
),
array(
'ru_RU',
NumberFormatter::DECIMAL,
NumberFormatter::TYPE_DOUBLE,
null,
1234567.891234567890000,
'1 234 567,891'
),
array(
'ru_RU',
NumberFormatter::PERCENT,
NumberFormatter::TYPE_DOUBLE,
null,
1234567.891234567890000,
'123 456 789 %'
),
array(
'ru_RU',
NumberFormatter::SCIENTIFIC,
NumberFormatter::TYPE_DOUBLE,
null,
1234567.891234567890000,
'1,23456789123457E6'
),
array(
'en_US',
NumberFormatter::DECIMAL,
NumberFormatter::TYPE_DOUBLE,
null,
1234567.891234567890000,
'1,234,567.891'
),
array(
'en_US',
NumberFormatter::PERCENT,
NumberFormatter::TYPE_DOUBLE,
null,
1234567.891234567890000,
'123,456,789%'
),
array(
'en_US',
NumberFormatter::SCIENTIFIC,
NumberFormatter::TYPE_DOUBLE,
null,
1234567.891234567890000,
'1.23456789123457E6'
),
Expand All @@ -124,21 +149,22 @@ public function currencyTestsDataProvider()
/**
* @dataProvider currencyTestsDataProvider
*/
public function testBasic($locale, $formatStyle, $formatType, $number, $expected)
public function testBasic($locale, $formatStyle, $formatType, $decimals, $number, $expected)
{
$this->assertMbStringEquals($expected, $this->helper->__invoke(
$number, $formatStyle, $formatType, $locale
$number, $formatStyle, $formatType, $locale, $decimals
));
}

/**
* @dataProvider currencyTestsDataProvider
*/
public function testSettersProvideDefaults($locale, $formatStyle, $formatType, $number, $expected)
public function testSettersProvideDefaults($locale, $formatStyle, $formatType, $decimals, $number, $expected)
{
$this->helper
->setLocale($locale)
->setFormatStyle($formatStyle)
->setDecimals($decimals)
->setFormatType($formatType);

$this->assertMbStringEquals($expected, $this->helper->__invoke($number));
Expand Down

0 comments on commit 058eeff

Please sign in to comment.