有些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指向“|”。