ESP8266,Nonos SDK,添加浮點Json數(shù)據(jù)的方法
確定浮點數(shù)要保留的位數(shù),將數(shù)字轉(zhuǎn)成字符,用Json庫里添加原始數(shù)據(jù)的形式,把轉(zhuǎn)換后的字符加到字段值里。
// 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])? // 整數(shù)部分,最大1后面18個0
? ? {
? ? ? ? sprintf((char*)(buff),"%s","0");
? ? ? ? return buff;
? ? }
? ? i = 0;
? ? if ( num < 0 )? // 添加負(fù)號
? ? {
? ? ? ? d_temp = - num;
? ? ? ? sprintf((char*)(buff+i),"%s","-");
? ? ? ? i++;
? ? }
? ? else
? ? {
? ? ? ? d_temp = num;
? ? }
? ? uint64 = (unsigned long long int)d_temp;? ? // 取整數(shù)部分
? ? sprintf((char*)(buff+i),"%lld",uint64);? ? ?// 添加整數(shù)部分
? ? if ( digit_num == 0 )? ? ? ? ? ? ? ? ? ? ? ?// 不要小數(shù)部分,到此就可以了
? ? {
? ? ? ? return (char* )buff;
? ? }
? ? // 判斷整數(shù)部分長度,確定小數(shù)點的位置
? ? for ( int_len = 0; int_len < 15; int_len++) // 結(jié)束后 (buff+i) 指向小數(shù)點
? ? {
? ? ? ? if ( uint64 < dec_table[int_len] ) // 0-1; 1-10;? ?2-100;? 3-1000
? ? ? ? {
if(int_len == 0)
{
i++;? ? // 整數(shù)小于1,也要占一位
}
? ? ? ? ? ? break;
? ? ? ? }
i++;
? ? }
? ? sprintf((char*)(buff+i),"%s",".");
? ? i++;? ? // (buff+i) 指向小數(shù)點后第一位
? ? 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);? ? // 防止小數(shù)部分溢出
? ? 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); // 添加小數(shù)部分
? ? return (char* )buff;
}
#define cJSON_AddNumberFloatToObject(object,name,num,digit_num,buff) cJSON_AddItemToObject(object, name, cJSON_CreateRaw(FloatToStr(num, digit_num, buff)))