Skip to content

Commit

Permalink
Add number_format filter.
Browse files Browse the repository at this point in the history
  • Loading branch information
markstory committed Dec 28, 2011
1 parent 670d5d7 commit 0edcfdd
Show file tree
Hide file tree
Showing 3 changed files with 93 additions and 0 deletions.
54 changes: 54 additions & 0 deletions lib/Twig/Extension/Core.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
class Twig_Extension_Core extends Twig_Extension
{
protected $dateFormat = 'F j, Y H:i';
protected $numberFormat = array(0, '.', ',');

/**
* Sets the default format to be used by the date filter.
Expand All @@ -36,6 +37,28 @@ public function getDateFormat()
return $this->dateFormat;
}

/**
* Sets the default format to be used by the number_format filter.
*
* @param integer $decimal The number of decimal places to use.
* @param string $decimalPoint The character(s) to use for the decimal point.
* @param string $thousandSep The character(s) to use for the thousands separator.
*/
public function setNumberFormat($decimal, $decimalPoint, $thousandSep)
{
$this->numberFormat = array($decimal, $decimalPoint, $thousandSep);
}

/**
* Get the default format used by the number_format filter.
*
* @return array The arguments for number_format()
*/
public function getNumberFormat()
{
return $this->numberFormat;
}

/**
* Returns the token parser instance to add to the existing list.
*
Expand Down Expand Up @@ -73,6 +96,7 @@ public function getFilters()
'date' => new Twig_Filter_Function('twig_date_format_filter', array('needs_environment' => true)),
'format' => new Twig_Filter_Function('sprintf'),
'replace' => new Twig_Filter_Function('strtr'),
'number_format' => new Twig_Filter_Function('twig_number_format_filter', array('needs_environment' => true)),

// encoding
'url_encode' => new Twig_Filter_Function('twig_urlencode_filter'),
Expand Down Expand Up @@ -310,6 +334,36 @@ function twig_date_format_filter(Twig_Environment $env, $date, $format = null, $
return $date->format($format);
}

/**
* Number format filter.
*
* All of the formatting options can be left null, in that case the defaults will
* be used. Supplying any of the parameters will override the defaults set in the
* environment object.
*
* @param Twig_Environment $env A Twig_Environment instance
* @param mixed $number A float/int/string of the number to format
* @param int $decimal The number of decimal points to display.
* @param string $decimalPoint The character(s) to use for the decimal point.
* @param string $thousandSep The character(s) to use for the thousands separator.
*
* @return string The formatted number
*/
function twig_number_format_filter(Twig_Environment $env, $number, $decimal = null, $decimalPoint = null, $thousandSep = null)
{
$defaults = $env->getExtension('core')->getNumberFormat();
if ($decimal === null) {
$decimal = $defaults[0];
}
if ($decimalPoint === null) {
$decimalPoint = $defaults[1];
}
if ($thousandSep === null) {
$thousandSep = $defaults[2];
}
return number_format((float) $number, $decimal, $decimalPoint, $thousandSep);
}

/**
* URL encodes a string.
*
Expand Down
18 changes: 18 additions & 0 deletions test/Twig/Tests/Fixtures/filters/number_format.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
--TEST--
"number_format" filter
--TEMPLATE--
{{ 20|number_format }}
{{ 20.25|number_format }}
{{ 20.25|number_format(2) }}
{{ 20.25|number_format(2, ',') }}
{{ 1020.25|number_format(2, ',') }}
{{ 1020.25|number_format(2, ',', '.') }}
--DATA--
return array();
--EXPECT--
20
20
20.25
20,25
1,020,25
1.020,25
21 changes: 21 additions & 0 deletions test/Twig/Tests/Fixtures/filters/number_format_default.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
--TEST--
"number_format" filter with defaults.
--TEMPLATE--
{{ 20|number_format }}
{{ 20.25|number_format }}
{{ 20.25|number_format(1) }}
{{ 20.25|number_format(2, ',') }}
{{ 1020.25|number_format }}
{{ 1020.25|number_format(2, ',') }}
{{ 1020.25|number_format(2, ',', '.') }}
--DATA--
$twig->getExtension('core')->setNumberFormat(2, '!', '=');
return array();
--EXPECT--
20!00
20!25
20!3
20,25
1=020!25
1=020,25
1.020,25

0 comments on commit 0edcfdd

Please sign in to comment.