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