Permalink
Browse files

fixed compilation of numeric values used in templates when using a lo…

…cale where the decimal separator is not a dot
  • Loading branch information...
1 parent 96632fb commit 90931b0a2717ff80d674d476114d5e7be68373ed @fabpot committed Mar 18, 2012
Showing with 44 additions and 0 deletions.
  1. +1 −0 CHANGELOG
  2. +10 −0 lib/Twig/Compiler.php
  3. +33 −0 test/Twig/Tests/CompilerTest.php
View
@@ -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)
View
@@ -146,6 +146,16 @@ public function string($value)
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');
@@ -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);
+ }
+}

0 comments on commit 90931b0

Please sign in to comment.