fixed compilation of numeric values used in templates when using a locale where the...
authorFabien Potencier <fabien.potencier@gmail.com>
Sun, 18 Mar 2012 23:08:15 +0000 (00:08 +0100)
committerFabien Potencier <fabien.potencier@gmail.com>
Sun, 18 Mar 2012 23:08:15 +0000 (00:08 +0100)
CHANGELOG
lib/Twig/Compiler.php
test/Twig/Tests/CompilerTest.php [new file with mode: 0644]

index da3e3fb..058e137 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,6 @@
 * 1.7.0 (2012-XX-XX)
 
+ * fixed compilation of numeric values used in templates when using a locale where the decimal separator is not a dot
  * made the strategy used to guess the real template file name and line number in exception messages much faster and more accurate
 
 * 1.6.2 (2012-03-18)
index 149a5a0..cd7f3ff 100644 (file)
@@ -146,6 +146,16 @@ class Twig_Compiler implements Twig_CompilerInterface
     public function repr($value)
     {
         if (is_int($value) || is_float($value)) {
+            if (false !== $locale = setlocale(LC_NUMERIC, 0)) {
+                setlocale(LC_NUMERIC, 'C');
+            }
+
+            $value = is_string($value) ? "'$value'" : (is_infinite($value) ? str_ireplace('INF', '.Inf', strval($value)) : strval($value));
+
+            if (false !== $locale) {
+                setlocale(LC_NUMERIC, $locale);
+            }
+
             $this->raw($value);
         } elseif (null === $value) {
             $this->raw('null');
diff --git a/test/Twig/Tests/CompilerTest.php b/test/Twig/Tests/CompilerTest.php
new file mode 100644 (file)
index 0000000..ebe79ae
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+class Twig_Tests_CompilerTest extends PHPUnit_Framework_TestCase
+{
+    public function testReprNumericValueWithLocale()
+    {
+        $compiler = new Twig_Compiler(new Twig_Environment());
+
+        $locale = setlocale(LC_NUMERIC, 0);
+        if (false === $locale) {
+            $this->markTestSkipped('Your platform does not support locales.');
+        }
+
+        $required_locales = array('fr_FR.UTF-8', 'fr_FR.UTF8', 'fr_FR.utf-8', 'fr_FR.utf8', 'French_France.1252');
+        if (false === setlocale(LC_ALL, $required_locales)) {
+            $this->markTestSkipped('Could not set any of required locales: ' . implode(", ", $required_locales));
+        }
+
+        $this->assertEquals('1.2', $compiler->repr(1.2)->getSource());
+        $this->assertContains('fr', strtolower(setlocale(LC_NUMERIC, 0)));
+
+        setlocale(LC_ALL, $locale);
+    }
+}