С++: преобразование wstring в double

Перед преобразованием wstring в double - как проверить его с помощью регулярного выражения? С Java проблем нет, а вот C++ вызывает вопросы.. :)


person Ernestas Gruodis    schedule 22.03.2014    source источник
comment
Почему раньше? Почему бы просто не преобразовать и посмотреть, работает ли это?   -  person Kerrek SB    schedule 23.03.2014
comment
В Java я могу поймать исключение или использовать "someString".matches(some regex), но как это сделать в C++?   -  person Ernestas Gruodis    schedule 23.03.2014
comment
Попробуйте преобразовать строку и посмотрите, работает ли она!   -  person Kerrek SB    schedule 23.03.2014
comment
Ааа, так что если это не так - будет возвращена ошибка?   -  person Ernestas Gruodis    schedule 23.03.2014
comment
Вы можете взглянуть на Boost.Lexical_Cast: boost. org/doc/libs/1_55_0/doc/html/boost_lexical_cast.html   -  person Alexander Tobias Bockstaller    schedule 23.03.2014
comment
Правильный. Вот как работает любой синтаксический анализ. Вы должны попробовать, прежде чем вы знаете, получится ли у вас.   -  person Kerrek SB    schedule 23.03.2014
comment
Не говоря уже о том, хорошая это идея или нет, вам, вероятно, следует начать с чтения о регулярных выражениях C++, а затем задать конкретный вопрос, если у вас возникнут проблемы с ним. Прямо сейчас вы не определили ни одной проблемы.   -  person user2802841    schedule 23.03.2014


Ответы (2)


Я полагаю, у вас есть string, и вы хотите знать, double это или нет. Следующий код не использует регулярные выражения. Вместо этого он инициализирует stringstream и считывает из него двойное значение. Если строка начинается с чего-то нечислового, то будет установлено 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.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;
}
person Alexander Tobias Bockstaller    schedule 22.03.2014
comment
Да, а если у меня только wstring - как правильно сделать? - person Ernestas Gruodis; 23.03.2014
comment
Отредактировал свой пост несколько секунд назад. Также есть std::wstringstream, если вам нужно работать с широкими строками символов. - person Alexander Tobias Bockstaller; 23.03.2014

Или, может быть, проще сделать это так:

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

А если strKeyValue==0 то значит не двойная.

person Ernestas Gruodis    schedule 22.03.2014
comment
Вы, наверное, имеете в виду, что если value=0, то это не double. А если strKeyValue="0.00"? - person Alexander Tobias Bockstaller; 23.03.2014
comment
Да, но в моей ситуации 0 - это уже плохой результат. Я пытаюсь получить версию Java из реестра Windows. Но в любом случае - мне понравилось решение с stringstream. - person Ernestas Gruodis; 23.03.2014