2009-05-27 15 views
12

Jak przekonwertować CString na double w C++?Jak przekonwertować CString na podwójne w C++?

Obsługa standardu Unicode również byłaby miła.

Dzięki!

+0

Naprawdę nie mogę uwierzyć, że to nie zostało jeszcze zadane ... ale poszukiwania niczego nie ujawniły. Jeśli jest to duplikat, proszę bądź łagodny :) –

+4

Nie można znaleźć tu odpowiedzi, ale użycie google "cstring to double" daje ci poprawną odpowiedź przy pierwszym trafieniu. –

+0

@AndrewBainbridge istotnie tak jest, jeśli przez "poprawną odpowiedź" masz na myśli tę stronę tutaj :) – aquirdturtle

Odpowiedz

25

CString można przekształcić do LPCTSTR, który jest w zasadzie const char* (const wchar_t* Unicode budowania).

Wiedząc o tym, można użyć atof():

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

... lub buduje Unicode, _wtof():

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

... albo do wspierania zarówno Unicode i non-Unicode buduje. ..

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

(_tstof() to makro, które rozwija się do atof() lub _wtof() na podstawie tego, czy _UNICODE jest zdefiniowana)

+2

Ten link pokazuje "wcstod", czyli to, co użyłem do obsługi Unicode. http://msdn.microsoft.com/en-us/library/kxsfc1ab(VS.80).aspx –

+1

To działa, ale sugestia IMO MighMoS o std :: stringstream jest nieco czystsza. – Pete

+0

_wcstod_l/_tcstod_l pozwala określić ustawienia narodowe, więc można obsługiwać format lokalny (separator dziesiętny jako przecinek lub kropka itp.). –

1

strtod (lub wcstod) skonwertuje ciągi znaków do wartości o podwójnej precyzji.

(Wymaga <stdlib.h> lub <wchar.h>)

+0

Zastanów się nad jakimś kontekstem dodawanej strony –

+0

Zaktualizowałeś mój wpis! – xian

+0

Przykłady użycia również nie pójdą źle ... Zobacz zaakceptowaną odpowiedź. – Shog9

4

z biblioteki boost lexical_cast, robisz

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

... 

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

Można konwertować nic do niczego użyciu std::stringstream. Jedynym wymaganiem jest implementacja operatorów. Łańcuchy strumieniowe można znaleźć w pliku nagłówkowym <sstream>.

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

To brzmiało dobrze dla mnie. Niestety nie zadziałało to w przypadku kwestionowanego scenariusza z typem CString firmy Microsoft (MFC). Mam to skompilowane, ale przekonwertowana podwójna liczba wydawała się być losowa, przynajmniej nie miała związku z ciągiem. Mam nadzieję, że działa dobrze dla innych typów, które lepiej implementują operatorów. Nie jestem ekspertem w używaniu łańcuchów std w C++, ale dla mnie konwerter, który powoduje błędne liczby bez zgłaszania błędu lub wyjątku, jest bardzo niebezpieczny. – Philm

+0

Uwaga: Inna propozycja tutaj, _tstof() działała dobrze, aby przekonwertować CString do podwójnego dla mnie. – Philm

+0

@Philm: Ta odpowiedź ** może ** być używana z obiektami "CString" MFC. Nie potrzebujesz też operatora '(<<). Do tego służy konstruktor: 'std :: wstringstream converter (myString);'. Zauważ, że wymaga to 'CStringW' (która w większości przypadków jest poprawnym typem). Jednak wciąż jest tam cichy zabójca. Wydaje się jasne, eleganckie. I źle. Używa bieżącego ustawienia narodowego wątku dla konwersji. To może, ale nie musi być to, co chcesz. Lepiej użyć rozwiązania, które pozwala jednoznacznie określić ustawienia narodowe używane do konwersji. – IInspectable

Powiązane problemy