如何将输入的温度字符串转换成温度数值
需求:最近在做一个新风空调温度控制项目,在设置温度模块需要对输入的温度进行读取,输入框中读取到的是字符串格式,比如 "25.0"
,怎么将其转换成int
类型的数据,比如将"25.0"
转换成int 250
进而判断温度值调节温度呢?
分析:先来分析一下可能出现的情况,输入可能出现 "25.5"
、"24.0"
,这都属于正常的情况,如果操作员输入了 "24"
,或者"24."
,也得将其转换成int 240
,还有不小心手抖输入了"24.."
或者"25..5"
,就需要提示错误输入。
思路:这个问题经过好几次修改和调试bug之后,菜鸟(me)终于确定了通过小数点来判断情况的解决思路,先数一下输入的字符串中有几个小数点,然后分3种情况讨论,代码中注释的很清晰。代码用到了C库中的字符串拼接函数strcat()
和字符转数字函数atoi()
/**
* @brief 将温度输入框中的字符串转换为温度值
* @param Temp_s
* @retval uint16_t 正确返回温度值 错误返回 -1
*/
int16_t lv_temp_str2num(const char* Temp_s)
{
char str[8] = {0};
uint8_t point_num = 0; //用于记录小数点的个数
uint8_t point_pos = 0; //用于记录小数点的位置
strcpy(str, Temp_s); //拷贝温度输入字符串到 str 中
/* 先数一下字符串中有几个'.' */
for(uint8_t i=0; i<strlen(str); i++)
{
if(str[i] == '.')
{
point_num++;
point_pos = i;
}
}
/* 对小数点的个数分情况判断 */
//如果输入的字符串中没有'.',补'0'后转数字,例如:"23"->230
if(point_num == 0)
{
strcat(str, "0");
return (atoi(str));
}
//如果'.'的个数超过1个,返回错误
else if(point_num > 1){
return -1;
}
//如果'.'的个数等于1,对小数点的位置判断
else{
//如果小数点在末尾,直接将'.'替换成'0',例如:“23.”->230
if(point_pos == strlen(str) - 1)
{
str[point_pos] = '0';
}else{ //如果小数点不在末尾,将'.'去掉后转数字,例如:"23.5"->235
str[point_pos] = '\0';
strcat(str, (str + point_pos + 1));
}
return(atoi(str));
}
}