一些机构帮助我解决以下问题
strFixFactorSide = _T("0.5");
dFixFactorSide = atof((const char *)(LPCTSTR)strFixFactorSide);
"dFixFactorSide" 取值为 0.0000;
我将如何获得正确的价值?
一些机构帮助我解决以下问题
strFixFactorSide = _T("0.5");
dFixFactorSide = atof((const char *)(LPCTSTR)strFixFactorSide);
"dFixFactorSide" 取值为 0.0000;
我将如何获得正确的价值?
使用_tstof()
代替atof()
,并将 CString 转换为 LPCTSTR,并保持原样,而不是尝试将其转换为const char *
. const char *
在使用 unicode 并仅使用const _TCHAR *
(LPCTSTR)时忘记(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;
}
并正确运行它会给出预期的答案。
我认为你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 字符串。