有些wince平台不支持_ttof,在tchar.h头文件中可以看到:
1 |
// Not implemented for CE |
2 |
#define _ttof _wtof |
3 |
#define _tstof _wtof |
所以无法使用_ttof将字符串转换为float值,这里考虑将unicode字符串先转换为多字节字符串,然后利用atof转换也应该可行。另外也可以实现一个自己的的_ttof,不过可能实现的没有系统提供的性能好,或者对各种字符串输入情况考虑的不周全(比如3.141.5926、3..1415926、3.1415926|等等)。不过仔细调试一下,用来完成自己的工作应该没有问题。下面简单实现一下:
1 |
float z_ttof(LPCTSTR ptr)
|
2 |
{ |
3 |
float result = 0.0;
|
4 |
int signal = 1;
|
5 |
int dotFlag = 0, cnt = 0;
|
6 |
int div = 1;
|
7 |
8 |
if((*ptr >= '0' && *ptr <= '9') || *ptr == '-' || *ptr == '+')
|
9 |
{
|
10 |
if(*ptr == '-' || *ptr == '+')
|
11 |
{
|
12 |
if(*ptr == '-')
|
13 |
signal = -1;
|
14 |
ptr++;
|
15 |
}
|
16 |
}
|
17 |
else
|
18 |
return 0.0;
|
19 |
20 |
while((*ptr >= '0' && *ptr <= '9') || *ptr == '.')
|
21 |
{
|
22 |
if(*ptr == '.')
|
23 |
{
|
24 |
if (dotFlag != 1)
|
25 |
{
|
26 |
dotFlag = 1;
|
27 |
ptr++;
|
28 |
continue;
|
29 |
}
|
30 |
else
|
31 |
break;
|
32 |
}
|
33 |
34 |
if(dotFlag == 1)
|
35 |
cnt++;
|
36 |
37 |
result = result * 10 + (*ptr++ - '0');
|
38 |
}
|
39 |
40 |
while(cnt--)
|
41 |
div *= 10;
|
42 |
43 |
return signal * result / div;
|
44 |
} |
不过由于浮点值的存储和除法计算的精度问题,最后得到的结果和原字符串中的浮点值会有点误差,这个应该不会影响到这个浮点值的使用。即使是系统提供的转换函数,也会有极其微小的误差,只要不是要飞月球的项目,这点误差应该是没问题吧。
如果需要字符串转double值,WinCE系统支持_tcstod函数,可以通过如下代码进行转换:
1 |
// Convert strings to a double-precision value. |
2 |
double StringToDouble(LPCTSTR lpszSrc)
|
3 |
{ |
4 |
TCHAR * endptr;
|
5 |
return _tcstod(lpszSrc, &endptr);
|
6 |
} |
endptr指向扫描结束字符,比如“3.1415926|”,_tcstod转换之后,endptr指向“|”。
















