diff --git a/c_src/encoder.c b/c_src/encoder.c index c3281d2..ec605e8 100644 --- a/c_src/encoder.c +++ b/c_src/encoder.c @@ -385,15 +385,34 @@ enc_long(Encoder* e, ErlNifSInt64 val) static inline int enc_double(Encoder* e, double val) { + char* start; + size_t len; + size_t i; + if(!enc_ensure(e, 32)) { return 0; } - //snprintf(&(e->p[e->i]), 31, "%0.20g", val); - sprintf(&(e->p[e->i]), "%.20g", val); - e->i += strlen(&(e->p[e->i])); - e->count++; + start = &(e->p[e->i]); + + sprintf(start, "%0.20g", val); + len = strlen(start); + + // Check if we have a decimal point + for(i = 0; i < len; i++) { + if(start[i] == '.' || start[i] == 'e' || start[i] == 'E') + goto done; + } + + if(len > 29) return 0; + + // Force a decimal point + start[len++] = '.'; + start[len++] = '0'; +done: + e->i += len; + e->count++; return 1; } diff --git a/test/003-numbers.t b/test/003-numbers.t index 70cc6ee..f580faf 100755 --- a/test/003-numbers.t +++ b/test/003-numbers.t @@ -35,22 +35,22 @@ good() -> 1234567890123456789012345012, <<"1234567890123456789012345012">> }, + {<<"1.0">>, 1.0}, { <<"0.000000000000000000000000000000000001">>, 1.0E-36, <<"9.9999999999999994104e-37">> }, - {<<"1.0">>, 1.0, <<"1">>}, {<<"0.75">>, 0.75}, {<<"2.0123456789">>, 2.0123456789, <<"2.0123456789000000455">>}, {<<"2.4234324E24">>, 2.4234324E24, <<"2.4234323999999998107e+24">>}, {<<"-3.1416">>, -3.1416, <<"-3.1415999999999999481">>}, - {<<"1E4">>, 10000.0, <<"10000">>}, - {<<"1.0E+01">>, 10.0, <<"10">>}, - {<<"1e1">>, 10.0, <<"10">>}, - {<<"3.0E2">>, 300.0, <<"300">>}, - {<<"0E3">>, 0.0, <<"0">>}, - {<<"1.5E3">>, 1500.0, <<"1500">>}, + {<<"1E4">>, 10000.0, <<"10000.0">>}, + {<<"1.0E+01">>, 10.0, <<"10.0">>}, + {<<"1e1">>, 10.0, <<"10.0">>}, + {<<"3.0E2">>, 300.0, <<"300.0">>}, + {<<"0E3">>, 0.0, <<"0.0">>}, + {<<"1.5E3">>, 1500.0, <<"1500.0">>}, {<<"2.5E-1">>, 0.25, <<"0.25">>}, {<<"-0.325E+2">>, -32.5, <<"-32.5">>} ]. diff --git a/test/005-arrays.t b/test/005-arrays.t index 53ffd2f..1c43c0e 100755 --- a/test/005-arrays.t +++ b/test/005-arrays.t @@ -17,7 +17,7 @@ good() -> {<<"[\t[\n]\r]">>, [[]], <<"[[]]">>}, {<<"[\t123, \r true\n]">>, [123, true], <<"[123,true]">>}, {<<"[1,\"foo\"]">>, [1, <<"foo">>]}, - {<<"[11993444355.0,1]">>, [11993444355.0,1], <<"[11993444355,1]">>}, + {<<"[11993444355.0,1]">>, [11993444355.0,1]}, { <<"[\"\\u00A1\",\"\\u00FC\"]">>, [<<194, 161>>, <<195, 188>>],