]> granicus.if.org Git - php/commitdiff
fix #41403 (json_decode cannot decode floats if localeconv decimal_point is not '.')
authorAntony Dovgal <tony2001@php.net>
Wed, 16 May 2007 12:53:36 +0000 (12:53 +0000)
committerAntony Dovgal <tony2001@php.net>
Wed, 16 May 2007 12:53:36 +0000 (12:53 +0000)
ext/json/JSON_parser.c
ext/json/tests/bug41403.phpt [new file with mode: 0644]

index fdd861152be65f26313b051d510b0c789d0070b0..b041a43cc17fb5407f42141f4d5752c6542c3939 100644 (file)
@@ -288,7 +288,7 @@ static void json_create_zval(zval **z, smart_str *buf, int type TSRMLS_DC)
     }
     else if (type == IS_DOUBLE)
     {
-        ZVAL_DOUBLE(*z, atof(buf->c));
+        ZVAL_DOUBLE(*z, zend_strtod(buf->c, NULL));
     }
     else if (type == IS_STRING)
     {
diff --git a/ext/json/tests/bug41403.phpt b/ext/json/tests/bug41403.phpt
new file mode 100644 (file)
index 0000000..369053f
--- /dev/null
@@ -0,0 +1,62 @@
+--TEST--
+Bug #41403 (json_decode cannot decode floats if localeconv decimal_point is not '.')
+--SKIPIF--
+<?php
+if (setlocale(LC_NUMERIC, "de_DE") === false) {
+       die("skip no de_DE locale");
+}
+?>
+--INI--
+precision=14
+--FILE--
+<?php
+
+setlocale(LC_NUMERIC, 'de_DE');
+var_dump(json_decode('[2.1]'));
+var_dump(json_decode('[0.15]'));
+var_dump(json_decode('[123.13452345]'));
+var_dump(json_decode('[123,13452345]'));
+
+echo "Done\n";
+?>
+--EXPECTF--    
+array(1) {
+  [0]=>
+  float(2,1)
+}
+array(1) {
+  [0]=>
+  float(0,15)
+}
+array(1) {
+  [0]=>
+  float(123,13452345)
+}
+array(2) {
+  [0]=>
+  int(123)
+  [1]=>
+  int(13452345)
+}
+Done
+--UEXPECTF--
+Strict Standards: setlocale(): deprecated in Unicode mode, please use ICU locale functions in %s on line %d
+array(1) {
+  [0]=>
+  float(2,1)
+}
+array(1) {
+  [0]=>
+  float(0,15)
+}
+array(1) {
+  [0]=>
+  float(123,13452345)
+}
+array(2) {
+  [0]=>
+  int(123)
+  [1]=>
+  int(13452345)
+}
+Done