有些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指向“|”。
本文介绍了如何在不支持_ttof的Wince平台上,通过将unicode字符串转换为多字节字符串,然后使用atof函数进行转换的方法。同时,提供了一个简单的自定义_ttof函数实现,并讨论了浮点数转换的精度问题。

被折叠的 条评论
为什么被折叠?



