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

0

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

  • 1
    Почему "до"? Почему бы просто не конвертировать и посмотреть, работает ли это?
  • 0
    В Java я могу поймать исключение или использовать "someString".matches(some regex) , но как это сделать в C ++?
Показать ещё 5 комментариев
Теги:
double
wstring

2 ответа

1
Лучший ответ

Я полагаю, у вас есть string и вы хотите знать, если она double или нет. Следующий код не использует регулярные выражения. Вместо этого он инициализирует stringstream и читает двойной из него. Если строка начинается с чего-то нечислового, то будет установлен ss.fail(). Если он начинается с числа, но не читает целую строку, то в конце строки есть что-то нечисловое. Так что если все ss.eof() && !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;
}
  • 0
    Да, и если у меня есть только wstring - как это сделать правильно?
  • 0
    Отредактировал мой пост несколько секунд назад. Также есть std::wstringstream если вам нужно работать со строками широких символов.
0

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

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

И если strKeyValue==0 то это означает, что он не двойной.

  • 0
    Вы, вероятно, имеете в виду, что если value=0 , то это не double . Но что, если strKeyValue="0.00" ?
  • 0
    Да, но в моей ситуации 0 - это уже плохой результат. Я пытаюсь получить версию Java из реестра Windows. Но все равно - мне понравилось решение с stringstream .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню