2009-05-27 12 views
12

CStringをC++のdoubleに変換するにはどうすればよいですか?C++でCStringをdoubleに変換するにはどうすればよいですか?

ユニコードのサポートもいいでしょう。

ありがとうございます!

+0

私は本当にこれがまだ尋ねられていないと信じていません...しかし、検索は何も明らかにされていません。それが重複している場合は、穏やかにしてください:) –

+4

ここでも答えは見つかりませんでしたが、 "cstring to double"というグーグルでは、最初のヒットで正しい答えが得られます。 –

+0

@AndrewBainbridge実際には、「正解」によってここにこのページが表示されている場合: – aquirdturtle

答えて

25

CString基本的LPCTSTRconst char*(Unicodeでconst wchar_t*ビルド)に変換することができる(<stdlib.h>又は<wchar.h>が必要)。これを知っ

、あなたは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()やライブラリのlexical_castブースト

+2

このリンクは、私がユニコードをサポートするために使った "wcstod"を示しています。 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)は、文字列を倍精度値に変換します。

+0

あなたが追加しているページにいくつかの文脈を考慮する –

+0

私の記事を更新しました! – xian

+0

使用例も間違っていません...受け入れられた答えを見てください。 – Shog9

4

_UNICODEが定義されているかどうかに基づいて_wtof())、あなたは

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

... 

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

あなたはstd::stringstreamを使用して何もに何かを変換することができません。唯一の要件は、演算子>><<が実装されていることです。 Stringstreamsは<sstream>ヘッダーファイルにあります。

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

これは私にはうってつけです。残念ながら、Microsoft(MFC)のCString型では疑問のあるシナリオではうまくいきませんでした。私はこれをコンパイルしましたが、変換された倍数はランダムであるようですが、少なくともそれは文字列とは関係ありませんでした。私は、それがより良い演算子を実現する他のタイプのためにうまく動作することを望みます。私はまだC + +で標準文字列を使用するには専門家ですが、私にはエラーや例外をスローせずに間違った数値をもたらすコンバータは非常に危険です。 – Philm

+0

備考:ここのもうひとつの提案である_tstof()は、CStringをdouble型に変換してくれました。 – Philm

+0

@Philm:この答え**は、MFCの 'CString'オブジェクトでもうまく使えます。 'operator <<()'は必要ありません。これがコンストラクタの目的です: 'std :: wstringstream converter(myString);'これには 'CStringW'が必要であることに注意してください(大抵の場合、正しい型です)。しかし、そこにはまだサイレントキラーがあります。それは明らかに、エレガントなようです。そして間違っている。現在のスレッドのロケールを変換に使用します。これはあなたが望むものかもしれません。変換に使用するロケールを明示的に指定できるソリューションを使用する方がよいでしょう。 – IInspectable

関連する問題