Remove '+' and leading zeros from exponents in the encoder
Fixes GH-39.
This commit is contained in:
parent
92d9b89d59
commit
8484ea3fb2
@ -76,6 +76,7 @@ int jsonp_strtod(strbuffer_t *strbuffer, double *out)
|
|||||||
int jsonp_dtostr(char *buffer, size_t size, double value)
|
int jsonp_dtostr(char *buffer, size_t size, double value)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
char *start, *end;
|
||||||
size_t length;
|
size_t length;
|
||||||
|
|
||||||
ret = snprintf(buffer, size, "%.17g", value);
|
ret = snprintf(buffer, size, "%.17g", value);
|
||||||
@ -95,14 +96,34 @@ int jsonp_dtostr(char *buffer, size_t size, double value)
|
|||||||
if(strchr(buffer, '.') == NULL &&
|
if(strchr(buffer, '.') == NULL &&
|
||||||
strchr(buffer, 'e') == NULL)
|
strchr(buffer, 'e') == NULL)
|
||||||
{
|
{
|
||||||
if(length + 2 >= size) {
|
if(length + 3 >= size) {
|
||||||
/* No space to append ".0" */
|
/* No space to append ".0" */
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
buffer[length] = '.';
|
buffer[length] = '.';
|
||||||
buffer[length + 1] = '0';
|
buffer[length + 1] = '0';
|
||||||
|
buffer[length + 2] = '\0';
|
||||||
length += 2;
|
length += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Remove leading '+' from positive exponent. Also remove leading
|
||||||
|
zeros from exponents (added by some printf() implementations) */
|
||||||
|
start = strchr(buffer, 'e');
|
||||||
|
if(start) {
|
||||||
|
start++;
|
||||||
|
end = start + 1;
|
||||||
|
|
||||||
|
if(*start == '-')
|
||||||
|
start++;
|
||||||
|
|
||||||
|
while(*end == '0')
|
||||||
|
end++;
|
||||||
|
|
||||||
|
if(end != start) {
|
||||||
|
memmove(start, end, length - (size_t)(end - buffer));
|
||||||
|
length -= (size_t)(end - start);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return (int)length;
|
return (int)length;
|
||||||
}
|
}
|
||||||
|
@ -1 +1 @@
|
|||||||
[1e+22]
|
[1e22]
|
@ -1 +1 @@
|
|||||||
[1.2299999999999999e+47]
|
[1.2299999999999999e47]
|
@ -1 +1 @@
|
|||||||
[1.23456e+80]
|
[1.23456e80]
|
Loading…
Reference in New Issue
Block a user