2009-05-27 34 views
12

Làm cách nào để chuyển đổi số CString thành số double bằng C++?Làm cách nào để chuyển đổi CString thành gấp đôi trong C++?

Hỗ trợ Unicode cũng sẽ tốt hơn.

Cảm ơn!

+0

Tôi thực sự không thể tin điều này chưa được hỏi ... nhưng tìm kiếm không tiết lộ gì cả. Nếu nó là một bản sao, hãy nhẹ nhàng :) –

+4

Không thể tìm thấy câu trả lời ở đây, hoặc, nhưng googling "cstring để tăng gấp đôi" sẽ cho bạn câu trả lời chính xác về lần truy cập đầu tiên. –

+0

@AndrewBainbridge thực sự nó, nếu bởi "câu trả lời đúng" bạn có nghĩa là trang này ngay tại đây :) – aquirdturtle

Trả lời

25

Một CString có thể chuyển đổi sang một LPCTSTR, mà cơ bản là một const char* (const wchar_t* trong Unicode xây dựng).

Biết được điều này, bạn có thể sử dụng atof():

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

... hoặc cho Unicode xây dựng, _wtof():

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

... hoặc để hỗ trợ cả hai Unicode và phi Unicode xây dựng. ..

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

(_tstof() là macro mở rộng đến atof() hoặc _wtof() dựa trên hay không _UNICODE được định nghĩa)

+2

Liên kết này hiển thị cho bạn "wcstod" là những gì tôi đã sử dụng để hỗ trợ unicode. http://msdn.microsoft.com/en-us/library/kxsfc1ab(VS.80).aspx –

+1

Tác phẩm này, nhưng đề xuất của IMO MighMoS về std :: stringstream là một trình dọn dẹp bit hơn. – Pete

+0

_wcstod_l/_tcstod_l cho phép người dùng chỉ định ngôn ngữ, vì vậy người ta có thể xử lý định dạng được bản địa hóa (dấu phân cách thập phân làm dấu phẩy hoặc dấu chấm, vv) –

1

strtod (hoặc wcstod) sẽ chuyển đổi chuỗi thành giá trị chính xác kép.

(Cần <stdlib.h> hoặc <wchar.h>)

+0

Hãy xem xét thêm một số ngữ cảnh cho trang bạn đang thêm –

+0

Cập nhật bài đăng của tôi! – xian

+0

Ví dụ về cách sử dụng sẽ không bị xóa hoặc ... Xem câu trả lời được chấp nhận. – Shog9

4

với tăng lexical_cast thư viện, bạn làm

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

... 

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

Bạn có thể chuyển đổi bất cứ điều gì để bất cứ điều gì sử dụng một std::stringstream. Yêu cầu duy nhất là các nhà khai thác >><< được triển khai. Chuỗi có thể được tìm thấy trong tệp tiêu đề <sstream>.

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

Điều này nghe có vẻ tốt với tôi. Thật không may nó đã không làm việc cho các kịch bản đặt câu hỏi ở đây với Microsoft (MFC) CString loại. Tôi đã nhận được biên dịch này, nhưng số lượng chuyển đổi gấp đôi dường như là ngẫu nhiên, ít nhất nó không có liên quan đến chuỗi. Tôi hy vọng, nó hoạt động tốt cho các loại khác mà thực hiện các nhà khai thác << and >> tốt hơn. Tôi không có chuyên gia nào được nêu ra trong việc sử dụng các chuỗi std trong C + +, nhưng với tôi một công cụ chuyển đổi mà kết quả trong số sai mà không ném một lỗi hoặc ngoại lệ là rất nguy hiểm. – Philm

+0

Ghi chú: Các gợi ý khác ở đây, _tstof() đã làm việc tốt để chuyển đổi một CString thành gấp đôi cho tôi. – Philm

+0

@Philm: Câu trả lời này ** có thể được sử dụng với các đối tượng 'CString' của MFC tốt. Bạn không cần 'toán tử <<()'. Đó là những gì mà hàm tạo là: 'std :: wstringstream converter (myString);'. Lưu ý rằng điều này đòi hỏi một 'CStringW' (mà, trong phần lớn các trường hợp, là loại chính xác anyway). Tuy nhiên, vẫn còn một kẻ giết người thầm lặng trong đó. Nó có vẻ rõ ràng, thanh lịch. Và sai. Nó sử dụng miền địa phương của luồng hiện tại để chuyển đổi. Điều này có thể hoặc không thể là những gì bạn muốn. Tốt hơn để sử dụng giải pháp cho phép bạn chỉ định rõ miền địa phương để sử dụng cho chuyển đổi. – IInspectable

Các vấn đề liên quan