bugfix: floating point representaion without fractional parttags/json-c-0.13-20171207
@@ -693,6 +693,7 @@ static int json_object_double_to_json_string_format(struct json_object* jso, | |||||
{ | { | ||||
char buf[128], *p, *q; | char buf[128], *p, *q; | ||||
int size; | int size; | ||||
double dummy; /* needed for modf() */ | |||||
/* Although JSON RFC does not support | /* Although JSON RFC does not support | ||||
NaN or Infinity as numeric values | NaN or Infinity as numeric values | ||||
ECMA 262 section 9.8.1 defines | ECMA 262 section 9.8.1 defines | ||||
@@ -706,7 +707,9 @@ static int json_object_double_to_json_string_format(struct json_object* jso, | |||||
size = snprintf(buf, sizeof(buf), "-Infinity"); | size = snprintf(buf, sizeof(buf), "-Infinity"); | ||||
else | else | ||||
size = snprintf(buf, sizeof(buf), | size = snprintf(buf, sizeof(buf), | ||||
format ? format : "%.17g", jso->o.c_double); | |||||
format ? format : | |||||
(modf(jso->o.c_double, &dummy) == 0) ? "%.17g.0" : "%.17g", | |||||
jso->o.c_double); | |||||
p = strchr(buf, ','); | p = strchr(buf, ','); | ||||
if (p) { | if (p) { | ||||
@@ -7,6 +7,7 @@ LIBJSON_LA=$(top_builddir)/libjson-c.la | |||||
TESTS= | TESTS= | ||||
TESTS+= test_util_file.test | TESTS+= test_util_file.test | ||||
TESTS+= test_float.test | |||||
TESTS+= test1.test | TESTS+= test1.test | ||||
TESTS+= test2.test | TESTS+= test2.test | ||||
TESTS+= test4.test | TESTS+= test4.test | ||||
@@ -0,0 +1,24 @@ | |||||
/* Copyright (C) 2016 by Rainer Gerhards | |||||
* Released under ASL 2.0 */ | |||||
#include "config.h" | |||||
#include <stdio.h> | |||||
#include "../json_object.h" | |||||
#include "../json_tokener.h" | |||||
int main(void) | |||||
{ | |||||
json_object *json; | |||||
json = json_object_new_double(1.0); | |||||
printf("json = %s\n", json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY)); | |||||
json_object_put(json); | |||||
json = json_object_new_double(1.23); | |||||
printf("json = %s\n", json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY)); | |||||
json_object_put(json); | |||||
json = json_object_new_double(123456789.0); | |||||
printf("json = %s\n", json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY)); | |||||
json_object_put(json); | |||||
json = json_object_new_double(123456789.123); | |||||
printf("json = %s\n", json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY)); | |||||
json_object_put(json); | |||||
return 0; | |||||
} |
@@ -0,0 +1,4 @@ | |||||
json = 1.0 | |||||
json = 1.23 | |||||
json = 123456789.0 | |||||
json = 123456789.123 |
@@ -0,0 +1,12 @@ | |||||
#!/bin/sh | |||||
# Common definitions | |||||
if test -z "$srcdir"; then | |||||
srcdir="${0%/*}" | |||||
test "$srcdir" = "$0" && srcdir=. | |||||
test -z "$srcdir" && srcdir=. | |||||
fi | |||||
. "$srcdir/test-defs.sh" | |||||
run_output_test test_float | |||||
exit $? |
@@ -31,8 +31,8 @@ new_obj.to_string()={ "foo": "bar", "baz": null, "bool0": true } | |||||
new_obj.to_string()={ "foo": [ null, "foo" ] } | new_obj.to_string()={ "foo": [ null, "foo" ] } | ||||
new_obj.to_string()={ "abc": 12, "foo": "bar", "bool0": false, "bool1": true, "arr": [ 1, 2, 3, null, 5 ] } | new_obj.to_string()={ "abc": 12, "foo": "bar", "bool0": false, "bool1": true, "arr": [ 1, 2, 3, null, 5 ] } | ||||
new_obj.to_string()={ "abc": "blue\nred\ngreen" } | new_obj.to_string()={ "abc": "blue\nred\ngreen" } | ||||
new_obj.to_string()=[ 0 ] | |||||
new_obj.to_string()=[ 0 ] | |||||
new_obj.to_string()=[ 0.0 ] | |||||
new_obj.to_string()=[ 0.0 ] | |||||
new_obj.to_string()=null | new_obj.to_string()=null | ||||
new_obj.to_string()=[ 9223372036854775807 ] | new_obj.to_string()=[ 9223372036854775807 ] | ||||
================================== | ================================== | ||||