C++ MFC中将double转换为CString

4

很抱歉我的英语不好。

我需要将double值转换为CString,因为我需要执行AfxMessageBox(double_value);

我找到了以下代码:

std::ostringstream ost;
ost << double_value;
std::cout << "As string: " << ost.str() << std::endl;
//AfxMessageBox(ost.str()); - Does not work.

我该怎么做呢?


当然不会起作用——AfxMessageBox期望一个double类型的参数,为什么它能够接受一个cstring呢? - Ariel Pinchover
AfxMessageBox不接受double类型的参数... - zmbq
@zmbq 不是说 AfxMessageBox(double_value) 期望一个 double 值吗?为什么不建议使用它呢? - Ariel Pinchover
AfxMessageBox需要CString类型的参数: AfxMessageBox("文本"); 它不是double类型。 - user2254511
实际上,AfxMessageBox期望的是LPCTSTR而不是CString,但后者有良好的隐式转换,因此它可以工作。您的尝试表明您使用了UNICODE配置,这导致了错误。您可以使用AfxMessageBoxA而不是AfxMessageBox。当然,使用被接受的答案也可以。 - Balog Pal
3个回答

14

AfxMessageBox 需要一个 CString 对象,因此将双精度数格式化为 CString,然后传递它:

CString str;
str.Format("As string: %g", double);
AfxMessageBox(str);

编辑:如果你想将值显示为整数(小数点后没有值),那么请使用以下内容:

str.Format("As string: %d", (int)double);

非常感谢,它可以工作。如果您知道的话,请告诉我如何裁剪/截取CString的一部分。我有12.09值,我需要12值。 - user2254511
使用%d代替%g,这将为您提供整数值。 - olevegard
%d 给我这个:作为字符串:-1546188226 - user2254511
@user2254511 你解决了你的问题吗?(将其转换为“int”是关键)。 - trojanfoe

0

根据您的Unicode设置,您需要

std::ostringstream ost;
ost << std::setprecision(2) << double_value;
std::cout << "As string: " << ost.str() << std::endl;
AfxMessageBox(ost.str().c_str());

或者

std::wostringstream ost;
ost << std::setprecision(2) << double_value;
std::wcout << L"As string: " << ost.str() << std::endl;
AfxMessageBox(ost.str().c_str());

这是必要的,因为CString有一个构造函数用于const char*const wchar_t*。没有std::string或std::wstring的构造函数。您还可以使用CString.Format,它具有与sprintf相同的非类型安全问题。 请注意,双重转换取决于区域设置。小数分隔符将取决于您的位置。

0
那是因为ost.str()不是一个CString,而是一个C++字符串对象。你需要将其转换为CString:new CString(ost.str())

抱歉,我是初学者。 CString sss = new CString(ost.str()); 无法工作。 - user2254511

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接