2012-05-12 98 views
-1

一些身體幫我就以下問題轉換的CString的浮動

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

「dFixFactorSide」取值爲0.0000;

我該如何獲得正確的價值?

回答

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字符串。

+0

我得到錯誤爲「錯誤C2065:'_wtof':未聲明的標識符」。我使用eVC++ 4.0 – Vaibhav

+0

你試過包括'','','',''嗎?其他人嘗試:'wcstod()'或'swscanf()'。 –

+0

我得到如下解決方案「_stscanf(strFixFactorSide,_T(」%lf「),&dFixFactorSide);」但這是正確的方式嗎? – Vaibhav

1

使用_tstof()而不是atof(),並將CString強制轉換爲LPCTSTR,並保持原樣,而不是試圖將其轉換爲const char *。在使用unicode時只能使用const _TCHAR *(LPCTSTR),請忘記const char *(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; 
} 

並正確運行這個預期的答案。