Skip to content

Commit 0e24e3c

Browse files
authored
Merge pull request open-source-parsers#547 from BrendanDrewDaqri/master
resolves open-source-parsers#546: Ensure floating point values on input render as floats on output
2 parents a1db52b + 89ab7ec commit 0e24e3c

File tree

2 files changed

+12
-6
lines changed

2 files changed

+12
-6
lines changed

src/lib_json/json_writer.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ namespace {
139139
JSONCPP_STRING valueToString(double value, bool useSpecialFloats, unsigned int precision) {
140140
// Allocate a buffer that is more than large enough to store the 16 digits of
141141
// precision requested below.
142-
char buffer[32];
142+
char buffer[36];
143143
int len = -1;
144144

145145
char formatString[6];
@@ -150,6 +150,12 @@ JSONCPP_STRING valueToString(double value, bool useSpecialFloats, unsigned int p
150150
// concepts of reals and integers.
151151
if (isfinite(value)) {
152152
len = snprintf(buffer, sizeof(buffer), formatString, value);
153+
154+
// try to ensure we preserve the fact that this was given to us as a double on input
155+
if (!strstr(buffer, ".") && !strstr(buffer, "e")) {
156+
strcat(buffer, ".0");
157+
}
158+
153159
} else {
154160
// IEEE standard states that NaN values will not compare to themselves
155161
if (value != value) {

src/test_lib_json/main.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ JSONTEST_FIXTURE(ValueTest, integers) {
479479
JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
480480
JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
481481
JSONTEST_ASSERT_EQUAL(false, val.asBool());
482-
JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
482+
JSONTEST_ASSERT_STRING_EQUAL("0.0", val.asString());
483483

484484
// Zero (signed constructor arg)
485485
val = Json::Value(0);
@@ -563,7 +563,7 @@ JSONTEST_FIXTURE(ValueTest, integers) {
563563
JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
564564
JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
565565
JSONTEST_ASSERT_EQUAL(false, val.asBool());
566-
JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
566+
JSONTEST_ASSERT_STRING_EQUAL("0.0", val.asString());
567567

568568
// 2^20 (signed constructor arg)
569569
val = Json::Value(1 << 20);
@@ -646,7 +646,7 @@ JSONTEST_FIXTURE(ValueTest, integers) {
646646
JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
647647
JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
648648
JSONTEST_ASSERT_EQUAL(true, val.asBool());
649-
JSONTEST_ASSERT_STRING_EQUAL("1048576",
649+
JSONTEST_ASSERT_STRING_EQUAL("1048576.0",
650650
normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
651651

652652
// -2^20
@@ -887,7 +887,7 @@ JSONTEST_FIXTURE(ValueTest, integers) {
887887
JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
888888
JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
889889
JSONTEST_ASSERT_EQUAL(true, val.asBool());
890-
JSONTEST_ASSERT_STRING_EQUAL("1099511627776",
890+
JSONTEST_ASSERT_STRING_EQUAL("1099511627776.0",
891891
normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
892892

893893
// -2^40
@@ -1259,7 +1259,7 @@ JSONTEST_FIXTURE(ValueTest, nonIntegers) {
12591259
// A 16-digit floating point number.
12601260
val = Json::Value(2199023255552000.0f);
12611261
JSONTEST_ASSERT_EQUAL(float(2199023255552000.0f), val.asFloat());
1262-
JSONTEST_ASSERT_STRING_EQUAL("2199023255552000",
1262+
JSONTEST_ASSERT_STRING_EQUAL("2199023255552000.0",
12631263
normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
12641264

12651265
// A very large floating point number.

0 commit comments

Comments
 (0)