前言
有时我们在编写ESP8266程序的时候,库函数提供的sprintf()函数不能将浮点型数据转为字符串。或者在编写内存较小的单片机时,使用sprintf()等库函数会占用较大的代码空间,这时我们就需要自己写一些占用内存较小的函数实现浮点型或整形转字符串的功能。
函数实现
整形转字符串
整形转字符串也就是将整形数据的每位数取出来,然后将每位数加上字符’0’,转换结束后加上字符串结束符’\0’,即可将整形数转化为字符串。如需要将1365转化为字符串即,将1365对10连续求余,结果为0则结束求余。那么1365可以求4次余,第一次为1,则将1加上字符’0’,求第5次的时候结果为0,则1365的位数就是4,5-1即为整形数的位数。代码实现如下所示:
/**
* @brief 整形数据转化到字符串
* @param date 需要转换成字符串的整形数据
* @param buffer 存放转换数据的字符串
*/
void int2string(int date,char* buffer)
{
int temp=0,absdate=0,i=0,j=0;
if(date>0)//判断是否大于0
{
buffer[0] = '+';
absdate=date;
}
else if(date==0)//如果等于0
{
buffer[0] = '0';
buffer[1] = '\0';
return ;
}
else//如果小于0
{
buffer[0] = '-';
absdate = -date;
}
temp = absdate;//取整数部分
for(i=0;temp!=0;i++)//计算整数部分的位数
temp /=10;
temp = absdate;//取整数部分
for(j=i;j>0;j--)//将整数部分转换成字符串型
{
if(date>=0) buffer[j-1] = temp%10+'0';
else buffer[j] = temp%10+'0';
temp /=10;
}
if(date>=0) buffer[i] = '\0';//加上字符串结束符
else buffer[i+1] = '\0';
}
浮点型转字符串
浮点型转字符串原理和整形转字符串原理差不多,刚开始需要把浮点型数据的整数部分取出来进行转换,最后再根据对小数点精确的位数进行四舍五入,比如对1.23进行四舍五入的话就是((int)(12.3+0.5)/10.0,相当于将12.8强制转换为整形后结果1然后除以10结果为1.2,即为四舍五入后的结构。具体实现函数如下所示。
/**
* @brief 浮点型数据转化到字符串
* @param slope 浮点型数据
* @param buffer 字符串
* @param n 小数点后几位
*/
void float2string(float slope,char* buffer,int n)
{
int temp,i,j;
int x=0;
float absslope=0;
if(slope>=0)//判断是否大于0
{
absslope = slope;
buffer[0] = '+';
}
else if(slope==0)
{
buffer[0] = '0';
buffer[1] = '\0';
return ;
}
else
{
buffer[0] = '-';
absslope = -slope;
}
temp = (int)absslope;//取整数部分
for(i=0;temp!=0;i++)//计算整数部分的位数
temp /=10;
temp =(int)absslope;
for(j=i;j>0;j--)//将整数部分转换成字符串型
{
if(slope>=0) buffer[j-1] = temp%10+'0';
else buffer[j] = temp%10+'0';
temp /=10;
}
if(slope>=0)
{
x=i+1;
buffer[i] = '.';
}
else
{
x=i+2;
buffer[i+1] = '.';
}
absslope -=(int)absslope;
for(i=x;i<x+n;i++)//将小数部分转换成字符串型
{
absslope*=10;
if(i==x+n-1)
{
absslope+=0.5;
}
buffer[i]=(int)absslope+'0';
absslope-=(int)absslope;
}
buffer[x+n] = '\0';
}