【问题标题】:C++: converting wstring to doubleC ++:将wstring转换为double
【发布时间】:2014-03-22 20:59:54
【问题描述】:

在将wstring 转换为double 之前 - 如何使用正则表达式对其进行验证? Java 没问题,但 C++ 提出了问题.. :)

【问题讨论】:

  • 为什么是“之前”?为什么不直接转换看看它是否有效?
  • 在 Java 中我可以捕获异常或使用"someString".matches(some regex),但如何在 C++ 中实现呢?
  • 尝试转换字符串,看看是否有效!
  • 你可能想看看 Boost.Lexical_Cast:boost.org/doc/libs/1_55_0/doc/html/boost_lexical_cast.html
  • 正确。这就是 any 类型的解析的工作原理。在你知道你是否会成功之前,你必须尝试。

标签: c++ double wstring


【解决方案1】:

我想你有一个string,你想知道它是否是double。以下代码不使用正则表达式。相反,它初始化 stringstream 并从中读取一个 double。如果字符串以非数字开头,则将设置ss.fail()。如果它以数字开头,但不读取整个字符串,则字符串末尾有一些非数字。所以如果一切顺利并且字符串真的只是一个数字,那么ss.eof() && !ss.fail() 将是true

#include <iostream>
#include <sstream>

int main()
{
    std::stringstream ss("123.456");
    double mydouble;
    ss >> mydouble;

    if (ss.eof() && !ss.fail())
        std::cout << "yay, success: " << mydouble << std::endl;
    else
        std::cout << "that was not a double." << std::endl;

    return 0;
}

如果需要转换宽字符串,还有std::wstringstream

您可能还想查看 boost 库,尤其是 Boost.Lexical_Cast。 使用此库,您可以执行以下操作:

#include <boost/lexical_cast.hpp>
#include <iostream>

int main()
{
    try
    {
        double mydouble = boost::lexical_cast<double>("123.456");
        std::cout << "yay, success: " << mydouble << std::endl;
    }
    catch(const boost::bad_lexical_cast &)
    {
        std::cout << "that was not a double." << std::endl;
    }

    return 0;
}

【讨论】:

  • 是的,如果我只有wstring - 该怎么做?
  • 几秒钟前编辑了我的帖子。如果您需要使用宽字符串,还有std::wstringstream
【解决方案2】:

或者这样做可能更简单:

std::wstring strKeyValue = "147.sd44";
double value = (double) _wtof(strKeyValue.c_str());

如果strKeyValue==0 则意味着它不是双重的。

【讨论】:

  • 你可能的意思是,如果value=0,那么它不是double。但是如果strKeyValue="0.00"呢?
  • 是的,但在我的情况下 0 - 这已经是糟糕的结果。我正在尝试从 Windows 注册表获取 Java 版本。但无论如何 - 我喜欢stringstream 的解决方案。
猜你喜欢
  • 2012-12-12
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-12
  • 2015-02-07
  • 1970-01-01
相关资源
最近更新 更多