如何在C++中将CString转换为double?

15

如何在C++中将CString转换为double?

同时支持Unicode会更好。

谢谢!


我真的不敢相信这个问题还没有被问过...但搜索没有发现。如果是重复的,请温柔点 :) - Steve Duitsman
4
这里也找不到答案,但在Google搜索“cstring to double”可以第一时间获得正确答案。 - Andrew Bainbridge
@AndrewBainbridge,确实如此,如果你所说的“正确答案”是指这个页面 :) - aquirdturtle
@aquirdturtle 我应该得到那样的回应。在过去的七年里,我已经学会不再写这样的评论了 :-) - Andrew Bainbridge
@AndrewBainbridge 提醒:三年多过去了,这个页面仍然是排名第一的结果。 - he77789
4个回答

33

CString可以转换为LPCTSTR,它基本上是一个const char*(在Unicode版本中为const wchar_t*)。

知道了这一点,您可以使用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() 是一个宏,根据 _UNICODE 是否被定义,会扩展为 atof() 或者 _wtof())


2
这个链接展示了“wcstod”,这是我用来支持Unicode的。http://msdn.microsoft.com/en-us/library/kxsfc1ab(VS.80).aspx - Steve Duitsman
1
这个可以运行,但在我看来,MighMoS的std::stringstream建议更加简洁。 - Pete
_wcstod_l / _tcstod_l 允许指定区域设置,因此可以处理本地化格式(小数分隔符为逗号或点等)。 - Rolf Kristensen

5

使用std::stringstream,您可以将任何东西转换为任何东西。唯一的要求是实现运算符>><<。字符串流可以在<sstream>头文件中找到。

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

这对我听起来不错。不幸的是,它在这里与 Microsoft (MFC) CString 类型的问题场景中没有起作用。我编译了这个程序,但转换后的双精度数似乎是随机的,至少它与字符串没有关系。我希望它能够适用于其他更好地实现 << 和 >> 运算符的类型。我还不是使用 C++ 中的 std 字符串的专家,但对我来说,一个结果错误的转换器而不抛出错误或异常是非常危险的。 - Philm
备注:在这里,另一个建议_tstof()对我来说将CString转换为double很好用。 - Philm
1
@Philm:这个答案可以很好地与MFC的CString对象一起使用。你也不需要一个operator<<()。这就是构造函数的作用:std::wstringstream converter(myString);。请注意,这需要一个CStringW(在大多数情况下,这是正确的类型)。然而,仍然存在一个潜在的问题。它似乎很清晰、优雅,但是错误的。它使用当前线程区域设置进行转换。这可能是你想要的,也可能不是。最好使用一种允许你明确指定转换所使用的区域设置的解决方案。 - IInspectable

3
使用Boost lexical_cast库,您可以进行以下操作:
#include <boost/lexical_cast.hpp>
using namespace boost;

...

double d = lexical_cast<double>(thestring);

1

strtod(或wcstod)将字符串转换为双精度值。

(需要<stdlib.h><wchar.h>


请考虑添加页面的更多上下文。 - Dave Hillier
最好附上使用示例...请参考被接受的答案。 - Shog9

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