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