mirror of
https://github.com/DaveGamble/cJSON.git
synced 2026-08-04 17:07:46 +00:00
print_number: Remove trailing zeroes (for doubles)
This commit is contained in:
@@ -324,12 +324,44 @@ static void update_offset(printbuffer * const buffer)
|
||||
buffer->offset += strlen((const char*)buffer_pointer);
|
||||
}
|
||||
|
||||
/* Removes trailing zeroes from the end of a printed number */
|
||||
static unsigned char *trim_trailing_zeroes(printbuffer * const buffer)
|
||||
{
|
||||
size_t offset = 0;
|
||||
unsigned char *content = NULL;
|
||||
|
||||
if ((buffer == NULL) || (buffer->buffer == NULL) || (buffer->offset < 1))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
offset = buffer->offset - 1;
|
||||
content = buffer->buffer;
|
||||
|
||||
while ((offset > 0) && (content[offset] == '0'))
|
||||
{
|
||||
offset--;
|
||||
}
|
||||
if ((offset > 0) && (content[offset] == '.'))
|
||||
{
|
||||
offset--;
|
||||
}
|
||||
|
||||
offset++;
|
||||
content[offset] = '\0';
|
||||
|
||||
buffer->offset = offset;
|
||||
|
||||
return content + offset;
|
||||
}
|
||||
|
||||
/* Render the number nicely from the given item into a string. */
|
||||
static unsigned char *print_number(const cJSON * const item, printbuffer * const output_buffer, const internal_hooks * const hooks)
|
||||
{
|
||||
unsigned char *output_pointer = NULL;
|
||||
double d = item->valuedouble;
|
||||
int length = 0;
|
||||
cjbool trim_zeroes = true; /* should at the end be removed? */
|
||||
|
||||
if (output_buffer == NULL)
|
||||
{
|
||||
@@ -339,6 +371,8 @@ static unsigned char *print_number(const cJSON * const item, printbuffer * const
|
||||
/* value is an int */
|
||||
if ((fabs(((double)item->valueint) - d) <= DBL_EPSILON) && (d <= INT_MAX) && (d >= INT_MIN))
|
||||
{
|
||||
trim_zeroes = false; /* don't remove zeroes for integers */
|
||||
|
||||
/* 2^64+1 can be represented in 21 chars. */
|
||||
output_pointer = ensure(output_buffer, 21, hooks);
|
||||
if (output_pointer != NULL)
|
||||
@@ -361,10 +395,12 @@ static unsigned char *print_number(const cJSON * const item, printbuffer * const
|
||||
else if ((fabs(floor(d) - d) <= DBL_EPSILON) && (fabs(d) < 1.0e60))
|
||||
{
|
||||
length = sprintf((char*)output_pointer, "%.0f", d);
|
||||
trim_zeroes = false; /* don't remove zeroes for "big integers" */
|
||||
}
|
||||
else if ((fabs(d) < 1.0e-6) || (fabs(d) > 1.0e9))
|
||||
{
|
||||
length = sprintf((char*)output_pointer, "%e", d);
|
||||
trim_zeroes = false; /* don't remove zeroes in engineering notation */
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -381,6 +417,11 @@ static unsigned char *print_number(const cJSON * const item, printbuffer * const
|
||||
|
||||
output_buffer->offset += (size_t)length;
|
||||
|
||||
if (trim_zeroes)
|
||||
{
|
||||
return trim_trailing_zeroes(output_buffer);
|
||||
}
|
||||
|
||||
return output_buffer->buffer + output_buffer->offset;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user