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