欢迎光临散文网 会员登陆 & 注册

ESP8266,Nonos SDK,添加浮点Json数据的方法

2022-04-03 15:24 作者:虎鹰0  | 我要投稿

确定浮点数要保留的位数,将数字转成字符,用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)))


ESP8266,Nonos SDK,添加浮点Json数据的方法的评论 (共 条)

分享到微博请遵守国家法律