2009-05-27 7 views
12

Как преобразовать CString в double в C++?Как преобразовать CString в double в C++?

Поддержка Юникода также будет приятной.

Спасибо!

+0

Я действительно не могу поверить, что этого еще не задавали ... но поиск ничего не показал. Если это дубликат, пожалуйста, будьте осторожны :) –

+4

Не удалось найти ответ здесь, но googling «cstring to double» дает вам правильный ответ при первом попадании. –

+0

@AndrewBainbridge действительно это делает, если «правильным ответом» вы имеете в виду эту страницу прямо здесь :) – aquirdturtle

ответ

25

CString может преобразовать в LPCTSTR, которая в основном const char* (const wchar_t* в Unicode версии).

Зная это, вы можете использовать atof():

CString thestring("13.37"); 
double d = atof(thestring). 

... или для сборки Unicode, _wtof():

CString thestring(L"13.37"); 
double d = _wtof(thestring). 

... или поддерживать как Unicode и не-Unicode строит. ..

CString thestring(_T("13.37")); 
double d = _tstof(thestring). 

(_tstof() - это макрос, который расширяется до atof() или _wtof() в зависимости от того или не определен _UNICODE)

+2

Эта ссылка показывает вам «wcstod», что я использовал для поддержки unicode. http://msdn.microsoft.com/en-us/library/kxsfc1ab(VS.80).aspx –

+1

Это работает, но предложение IMO MighMoS о std :: stringstream немного чище. – Pete

+0

_wcstod_l/_tcstod_l позволяет указать локаль, поэтому можно обрабатывать локализованный формат (десятичный разделитель как запятая или точка и т. Д.) –

1

strtod (или wcstod) преобразует строки в значение двойной точности.

(Требует <stdlib.h> или <wchar.h>)

+0

Рассмотрите еще какой-нибудь контекст на странице, которую вы добавляете –

+0

Обновлено мое сообщение! – xian

+0

Примеры использования не пойдет на пользу ... См. Принятый ответ. – Shog9

4

с повышением lexical_cast библиотеки, вы

#include <boost/lexical_cast.hpp> 
using namespace boost; 

... 

double d = lexical_cast<double>(thestring); 
5

Вы можете конвертировать ничего ни к чему используя std::stringstream. Единственное требование - реализовать операторы >> и <<. Строковые потоки можно найти в файле заголовка <sstream>.

std::stringstream converter; 
converter << myString; 
converter >> myDouble; 
+0

Это звучало хорошо для меня. К сожалению, это не сработало для сомнительного сценария здесь с типом CString Microsoft (MFC). Я получил это скомпилированное, но преобразованное двойное число показалось случайным, по крайней мере, оно не имело никакого отношения к строке. Надеюсь, он отлично подходит для других типов, которые лучше реализуют операторы << and >. Я еще не эксперт в использовании std строк в C++, но для меня очень опасен конвертер, который приводит к неправильным номерам без выброса ошибки или исключения. – Philm

+0

Примечание: Другое предложение здесь, _tstof() отлично работало для преобразования CString в double для меня. – Philm

+0

@Philm: Этот ответ ** может использоваться ** с объектами MFC 'CString' просто отлично. Вам также не нужен 'operator <<()'. Это то, что конструктор для: 'std :: wstringstream converter (myString);'. Обратите внимание, что для этого требуется 'CStringW' (который в большинстве случаев является правильным типом). Тем не менее, там все еще тихий убийца. Это кажется ясным, изящным. И неправильно. Он использует текущую локализацию потока для преобразования. Это может быть или не быть тем, что вы хотите. Лучше использовать решение, которое позволяет явно указать язык, который будет использоваться для преобразования. – IInspectable