Add number_format filter.
authorMark Story <mark@freshbooks.com>
Wed, 28 Dec 2011 15:39:04 +0000 (10:39 -0500)
committerMark Story <mark@freshbooks.com>
Wed, 28 Dec 2011 15:39:04 +0000 (10:39 -0500)
Refs #417

lib/Twig/Extension/Core.php
test/Twig/Tests/Fixtures/filters/number_format.test [new file with mode: 0644]
test/Twig/Tests/Fixtures/filters/number_format_default.test [new file with mode: 0644]

index 4c326f5..e247c95 100644 (file)
@@ -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 (file)
index 0000000..639a865
--- /dev/null
@@ -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 (file)
index 0000000..c6903cc
--- /dev/null
@@ -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