ESP8266,Nonos SDK,添加浮点Json数据的方法
确定浮点数要保留的位数,将数字转成字符,用Json库里添加原始数据的形式,把转换后的字符加到字段值里。
// 18后面跟18个0,18446744073709551615
static const unsigned long long int dec_table[]=
{
1,
10,
100,
1000,
10000,
100000,
1000000,
10000000,
100000000,
1000000000,
10000000000,
100000000000,
1000000000000,
10000000000000,
100000000000000,
1000000000000000,
10000000000000000,
100000000000000000,
1000000000000000000,
18446744073709551615, // Max unsigned long long int
};
#define TABLE_MAX (18)
// sprintf更换成os_sprintf
char* FloatToStr(double num, unsigned int digit_num, char* buff)
{
double d_temp;
unsigned long long int uint64;
unsigned char int_len;
unsigned char i;
if (num > dec_table[TABLE_MAX]) // 整数部分,最大1后面18个0
{
sprintf((char*)(buff),"%s","0");
return buff;
}
i = 0;
if ( num < 0 ) // 添加负号
{
d_temp = - num;
sprintf((char*)(buff+i),"%s","-");
i++;
}
else
{
d_temp = num;
}
uint64 = (unsigned long long int)d_temp; // 取整数部分
sprintf((char*)(buff+i),"%lld",uint64); // 添加整数部分
if ( digit_num == 0 ) // 不要小数部分,到此就可以了
{
return (char* )buff;
}
// 判断整数部分长度,确定小数点的位置
for ( int_len = 0; int_len < 15; int_len++) // 结束后 (buff+i) 指向小数点
{
if ( uint64 < dec_table[int_len] ) // 0-1; 1-10; 2-100; 3-1000
{
if(int_len == 0)
{
i++; // 整数小于1,也要占一位
}
break;
}
i++;
}
sprintf((char*)(buff+i),"%s",".");
i++; // (buff+i) 指向小数点后第一位
d_temp = d_temp - (double)uint64;
if ( (digit_num+1) > TABLE_MAX )
{
digit_num = TABLE_MAX-1;
}
uint64 = (unsigned long long int)((double)d_temp*(double)dec_table[digit_num+1] - 0.00000000000000001); // 防止小数部分溢出
uint64 = uint64/10;
for ( ; (uint64 < dec_table[digit_num-1]); digit_num--)
{
if ( digit_num <= 1)
{
break;
}
sprintf((char*)(buff+i),"%d",(int)0);
i++;
}
sprintf((char*)(buff+i),"%lld",uint64); // 添加小数部分
return (char* )buff;
}
#define cJSON_AddNumberFloatToObject(object,name,num,digit_num,buff) cJSON_AddItemToObject(object, name, cJSON_CreateRaw(FloatToStr(num, digit_num, buff)))