static cJSON_bool print_number(const cJSON * const item, printbuffer * const output_buffer)
{
    unsigned char *output_pointer = NULL;
    // double d = item->valuedouble;
    long long d = item->valuelonglong;
    int length = 0;
    size_t i = 0;
    unsigned char number_buffer[26]; /* temporary buffer to print the number into */
    unsigned char decimal_point = get_decimal_point();
    double test;

    if (output_buffer == NULL)
    {
        return false;
    }
    /* This checks for NaN and Infinity */
    if ((d * 0) != 0)
    {
        length = sprintf((char*)number_buffer, "null");
    }
    else
    {
        /* Try 15 decimal places of precision to avoid nonsignificant nonzero digits */
        // length = sprintf((char*)number_buffer, "%1.15g", d);
        unsigned char number_buffer1[26] = {'\0'};
        unsigned char number_buffer2[26] = {'\0'};
        if (d >= 0)
        {
            if ((d >> 32) != 0)
            {
                sprintf((char*)number_buffer1, "%lu", d / 10000000000);
            sprintf((char*)number_buffer2, "%lu", d % 10000000000);
        }
        else
        {
            unsigned long long t = 0;
            
            t = 0 - (unsigned long long)d;
            
            if ((t >> 32) != 0)
            {
                number_buffer1[0] = '-';
                length = sprintf((char*)&number_buffer1[1], "%lu", t / 10000000000);
            }
            if (length == 0)
            {
                number_buffer2[0] = '-';
                sprintf((char*)&number_buffer2[1], "%lu", t % 10000000000);
            }
            else
            {
                sprintf((char*)number_buffer2, "%lu", t % 10000000000);
            }
        }

        length = sprintf((char*)number_buffer, "%s%s", number_buffer1, number_buffer2);

        // /* Check whether the original double can be recovered */
        // if ((sscanf((char*)number_buffer, "%lg", &test) != 1) || ((double)test != d))
        // {
        //     /* If not, print with 17 decimal places of precision */
        //     length = sprintf((char*)number_buffer, "%1.17g", d); */
        // }
    }

    /* sprintf failed or buffer overrun occured */
    if ((length < 0) || (length > (int)(sizeof(number_buffer) - 1)))
    {
        return false;
    }

    /* reserve appropriate space in the output */
    output_pointer = ensure(output_buffer, (size_t)length + sizeof(""));
    if (output_pointer == NULL)
    {
        return false;
    }

    /* copy the printed number to the output and replace locale
     * dependent decimal point with '.' */
    for (i = 0; i < ((size_t)length); i++)
    {
        if (number_buffer[i] == decimal_point)
        {
            output_pointer[i] = '.';
            continue;
        }

        output_pointer[i] = number_buffer[i];
    }
    output_pointer[i] = '\0';

    output_buffer->offset += (size_t)length;

    return true;
}       
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐