【问题标题】:How do I convert a CString to a double in C++?如何在 C++ 中将 CString 转换为 double?
【发布时间】:2010-10-29 08:13:57
【问题描述】:

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

Unicode 支持也不错。

谢谢!

【问题讨论】:

  • 我真的不敢相信这还没有被问到......但搜索什么也没发现。如果是重复的,请温柔:)
  • 在这里也找不到答案,但是谷歌搜索“cstring to double”可以让你在第一次点击时得到正确的答案。
  • @AndrewBainbridge 确实如此,如果你所说的“正确答案”是指这个页面就在这里:)
  • @aquirdturtle 这是我应得的。在过去的 7 年里,我学会了不要写这样的 cmets :-)
  • @AndrewBainbridge 提醒:3 年多过去了,这个页面仍然是最高结果。

标签: c++ string visual-c++ double type-conversion


【解决方案1】:

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()

【讨论】:

  • 此链接显示“wcstod”,这是我用来支持 unicode 的。 msdn.microsoft.com/en-us/library/kxsfc1ab(VS.80).aspx
  • 这行得通,但 IMO MighMoS 对 std::stringstream 的建议更简洁一些。
  • _wcstod_l / _tcstod_l 允许指定语言环境,因此可以处理本地化格式(逗号或点等十进制分隔符)
【解决方案2】:

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

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

【讨论】:

  • 这听起来不错。不幸的是,它不适用于 Microsoft (MFC) CString 类型的问题场景。我得到了这个编译,但转换后的双数似乎是随机的,至少它与字符串无关。我希望,它适用于更好地实现 > 运算符的其他类型。我还不是在 C++ 中使用 std 字符串的专家,但对我来说,在不引发错误或异常的情况下产生错误数字的转换器非常危险。
  • 备注:这里的另一个建议,_tstof() 可以很好地将 CString 转换为双精度。
  • @Philm:这个答案可以与 MFC 的 CString 对象一起使用就好了。你也不需要operator&lt;&lt;()。这就是构造函数的用途:std::wstringstream converter(myString);。请注意,这需要CStringW(在大多数情况下,无论如何它都是正确的类型)。然而,那里仍然有一个沉默的杀手。它看起来很清晰,很优雅。并且错了。它使用当前线程语言环境进行转换。这可能是也可能不是您想要的。最好使用允许您明确指定用于转换的语言环境的解决方案。
【解决方案3】:

有了 boost lexical_cast 库,你就可以了

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

...

double d = lexical_cast<double>(thestring);

【讨论】:

    【解决方案4】:

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

    (需要&lt;stdlib.h&gt;&lt;wchar.h&gt;

    【讨论】:

    • 为您添加的页面考虑更多上下文
    • 使用示例也不会出错...查看接受的答案。
    猜你喜欢
    • 2015-08-23
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 2010-09-05
    • 1970-01-01
    • 2023-01-23
    • 2013-03-07
    相关资源
    最近更新 更多