From 0edcfdd28ba17ab859921078e8937e66034573af Mon Sep 17 00:00:00 2001 From: Mark Story Date: Wed, 28 Dec 2011 10:39:04 -0500 Subject: [PATCH] Add number_format filter. Refs #417 --- lib/Twig/Extension/Core.php | 54 ++++++++++++++++++++ .../Twig/Tests/Fixtures/filters/number_format.test | 18 +++++++ .../Fixtures/filters/number_format_default.test | 21 ++++++++ 3 files changed, 93 insertions(+), 0 deletions(-) create mode 100644 test/Twig/Tests/Fixtures/filters/number_format.test create mode 100644 test/Twig/Tests/Fixtures/filters/number_format_default.test diff --git a/lib/Twig/Extension/Core.php b/lib/Twig/Extension/Core.php index 4c326f5..e247c95 100644 --- a/lib/Twig/Extension/Core.php +++ b/lib/Twig/Extension/Core.php @@ -15,6 +15,7 @@ if (!defined('ENT_SUBSTITUTE')) { 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. @@ -37,6 +38,28 @@ class Twig_Extension_Core extends Twig_Extension } /** + * 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. * * @return array An array of Twig_TokenParser instances @@ -73,6 +96,7 @@ class Twig_Extension_Core extends Twig_Extension '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'), @@ -311,6 +335,36 @@ function twig_date_format_filter(Twig_Environment $env, $date, $format = null, $ } /** + * 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. * * @param string $url A URL diff --git a/test/Twig/Tests/Fixtures/filters/number_format.test b/test/Twig/Tests/Fixtures/filters/number_format.test new file mode 100644 index 0000000..639a865 --- /dev/null +++ b/test/Twig/Tests/Fixtures/filters/number_format.test @@ -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 diff --git a/test/Twig/Tests/Fixtures/filters/number_format_default.test b/test/Twig/Tests/Fixtures/filters/number_format_default.test new file mode 100644 index 0000000..c6903cc --- /dev/null +++ b/test/Twig/Tests/Fixtures/filters/number_format_default.test @@ -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 -- 1.7.2.5