独闷闷网
标题:
带小数点的字符串如何转换成变量,谁有此转换算法的参考程序?已解答。
[打印本页]
作者:
jianhong_wu
时间:
2015-9-13 01:16
标题:
带小数点的字符串如何转换成变量,谁有此转换算法的参考程序?已解答。
小明-陕西:
问下,我想串口发送这个字符串,但是里面那个123.4想变成一个变量怎么弄?
★坚鸿-深圳:
字符串“123.4”转换成unsigned int变量1234,这是最常用的算法,不要用任何库涵数,要自己动脑写转换算法,否则一辈子都不提高。分析步骤如下:
(1)字符串“123.4”先过滤小数点变成字符串“1234”
(2)任何数字字符减去字符“0”就等于它的变量本身。比如字符“5”减去“0”就等于变量5。
我写的转换算法参考代码如下:
#include "REG52.H"
//const unsigned char *pu8StringBuffer 代表被转换的字符串数组
//unsigned char u8StringSize 代表数组的有效位数
//unsigned long *pu32ResultData 代表转换后的结果数据。必须加&符号带入此函数形参,表示传址。
//unsigned char *pu8ResultDotSize 代表转后结果数据的小数点数。必须加&符号带入此函数形参,表示传址。
void string_to_data(const unsigned char *pu8StringBuffer,unsigned char u8StringSize,unsigned long *pu32ResultData,unsigned char *pu8ResultDotSize);
unsigned char aaaa1[]="123.4";
unsigned long Gu32Data; //转换后的变量数值结果
unsigned char Gu8Dot; //转换后的变量所带的小数点个数
void main() //主程序
{
//注意,Gu32Data和Gu8Dot要加&符号代表传地址给指针
string_to_data(aaaa1,5,&Gu32Data,&Gu8Dot);
while(1);
}
//const unsigned char *pu8StringBuffer 代表被转换的字符串数组
//unsigned char u8StringSize 代表数组的有效位数
//unsigned long *pu32ResultData 代表转换后的结果数据。必须加&符号带入此函数形参,表示传址。
//unsigned char *pu8ResultDotSize 代表转后结果数据的小数点数。必须加&符号带入此函数形参,表示传址。
void string_to_data(const unsigned char *pu8StringBuffer,unsigned char u8StringSize,unsigned long *pu32ResultData,unsigned char *pu8ResultDotSize)
{
unsigned char i;
unsigned char k;
unsigned char u8DotSize;
unsigned char u8DotFlag;
unsigned long u32Data;
unsigned long u32Temp;
unsigned long u32TenTimes;
unsigned char u8DataBuffer[15]; //数组缓存
k=0;
u8DotSize=0; //记录小数点数
u8DotFlag=0; //有小数点的标志
for(i=0;i<u8StringSize;i++)
{
if(pu8StringBuffer[i]>='0'&&pu8StringBuffer[i]<='9') //只收留数字,过滤其它干扰字符
{
u8DataBuffer[k]=pu8StringBuffer[i]; //去掉干扰字符,左对齐
k++; //k也是当前的有效数据
if(1==u8DotFlag) //表示当前的是小数点后面的数据
{
u8DotSize++; //统计小数点后的位数
}
}
else if('.'==pu8StringBuffer[i]) //如果是小数点
{
u8DotFlag=1; //标志位置1,代表后面的数据都是小数点数据了
}
}
u32Data=0; //转换的变量结果
u32Temp=0; //临时中间变量
u32TenTimes=1; //不断以10倍放大,代表后面个十百千万的位数
for(i=0;i<k;i++) //此时k是有效数据的个数
{
//减去'0'是字符转换成变量,同时让一个char的数据放到一个long类型的临时变量u32Temp里,避免乘法溢出
u32Temp=u8DataBuffer[k-1-i]-'0';
u32Data=u32Data+u32Temp*u32TenTimes;
u32TenTimes=u32TenTimes*10; //以10倍不断放大的系数,代表后面个十百千万的位数
}
*pu32ResultData=u32Data; //把数据的转换结果输出
*pu8ResultDotSize=u8DotSize; //把小数点个数的转换结果输出
}
复制代码
欢迎光临 独闷闷网 (http://www.dumenmen.com/)
Powered by Discuz! X3.2