将CString转换为float

时间:2012-05-12 12:09:38

标签: visual-c++ mfc floating-point cstring

有些人帮我解决了以下问题

strFixFactorSide = _T("0.5"); 
dFixFactorSide = atof((const char *)(LPCTSTR)strFixFactorSide);

“dFixFactorSide”取值为0.0000;

我将如何获得正确的价值?

2 个答案:

答案 0 :(得分:1)

使用_tstof()代替atof(),并将CString转换为LPCTSTR,并保留原样,而不是尝试将其转到const char *。在使用unicode并仅使用const char *(LPCTSTR)时忘记const _TCHAR *(LPCSTR)。

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    CString s1 = _T("123.4");
    CString s2 = _T("567.8");

    double v1 = _tstof((LPCTSTR)s1);
    double v2 = _tstof((LPCTSTR)s2);

    _tprintf(_T("%.3f"), v1 + v2);

    return nRetCode;
}

并正确运行会给出预期的答案。

答案 1 :(得分:0)

我认为你的CString strFixFactorSide是一个Unicode(UTF-16)字符串。

如果是,则转换(const char *)仅更改指针类型,但它指向的字符串仍然是Unicode。

atof()不适用于Unicode字符串。如果你将L"0.5"推入其中,它将获取字节0x30('0')和0x00(也是UTF-16'0'的一部分),将其视为以NUL结尾的ASCII字符串"0"和将其转换为0.0。

如果CString strFixFactorSide是Unicode字符串,则需要先将其转换为ASCII字符串,然后应用atof()或使用能够将Unicode字符串转换为数字的函数。 _wtof()可用于Unicode字符串。