cJSON代码阅读(10)——把数值构造成JSON格式

print_number是对数值进行格式化的主要函数
1、首先判断数值是否为0,如果是0,那么直接把0转换成字符串"0",然后返回
2、如果数值可以使用整数表达,那么对这个数值进行整形的格式化
3、对于其他的数值(即不是0,也不能用整形表示的其他浮点数),进行浮点型的格式化

/* Render the number nicely from the given item into a string. */
// 把json节点中的数值转换为字符串
static char *print_number(cJSON *item,printbuffer *p)
{
    char *str=0;

    double d=item->valuedouble;

    // 如果值是0
    if (d==0)
    {
        if (p)
            str=ensure(p,2);
        else
            str=(char*)cJSON_malloc(2);	/* special case for 0. */

        if (str)
            strcpy(str,"0");
    }
    // 格式化可以使用整数表达的浮点数(DBL_EPSILON是浮点数能够表达的最小精确值,如果两个数之差小于DBL_EPSILON,那么计算机会认为他们相等)
    else if (fabs(((double)item->valueint)-d)<=DBL_EPSILON && d<=INT_MAX && d>=INT_MIN)
    {
        if (p)
            str=ensure(p,21);
        else
            str=(char*)cJSON_malloc(21);	/* 2^64+1 can be represented in 21 chars. */

        if (str)
            sprintf(str,"%d",item->valueint);
    }
    // 格式化那些不是0也不能用整数表达的浮点数
    else
    {
        if (p)
            str=ensure(p,64);
        else
            str=(char*)cJSON_malloc(64);	/* This is a nice tradeoff. */

        if (str)
        {
            if (fabs(floor(d)-d)<=DBL_EPSILON && fabs(d)<1.0e60)
                sprintf(str,"%.0f",d);
            else if (fabs(d)<1.0e-6 || fabs(d)>1.0e9)
                sprintf(str,"%e",d);
            else
                sprintf(str,"%f",d);
        }
    }
    return str;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值