2012-05-12 1 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'), считать это как ASCII-строку NUL-конца "0" и преобразовать ее в 0.0.

Если CString strFixFactorSide является строкой в ​​формате Юникод, необходимо сначала преобразовать ее в строку 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 *. Забудьте о const char * (LPCSTR), пока вы работаете с unicode и используете только const _TCHAR * (LPCTSTR).

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; 
} 

и работает правильно, дает ожидаемый ответ.