Как проверить строку на действительное двойное содержимое с помощью boost::spirit::x3?

Я пытаюсь определить, является ли данная строка допустимым двойным представлением. Код, который я использую, выглядит так:

bool testNumeric(const std::string& s)
{
    try
    {
        const auto doubleParser = boost::spirit::x3::double_;
        auto iter = s.begin();
        auto end_iter = s.end();
        double result = 0.;
        boost::spirit::x3::parse(iter, end_iter, doubleParser, result);
        return iter == end_iter;
    }
    catch (...)
    {
        return false;
    }
}

Полученный дубль меня не интересует (пока). Если я дам этой функции вход "1e10000000", что явно слишком велико для двойного числа, программа завершится ошибкой с утверждением (BOOST_ASSERT). Можно ли это как-то изменить, чтобы либо сбой по коду возврата, либо исключение, которое я могу поймать? Или мне нужно написать свой собственный двойной парсер с spirit::x3?


person mgr    schedule 13.02.2019    source источник
comment
Почему бы просто не использовать std::stod или std::strtod?   -  person Some programmer dude    schedule 13.02.2019
comment
@Someprogrammerdude, конечно, потому что эти функции не беспокоят завершающие нечисловые символы после действительного числового ввода (например, если локаль ожидает точку, а не запятую, программа может понять 3, когда пользователь может ввести 3,1415, и никто не заметит ошибку, поскольку данные будут считаться правильными.   -  person Christophe    schedule 13.02.2019
comment
Вы можете использовать аргумент pos для обнаружения завершающих символов.   -  person Alan Birtles    schedule 13.02.2019
comment
@Christophe Эти функции также поддерживают проверку этого. std::stod с аргументом pos и std::strtod с аргументом str_end.   -  person Some programmer dude    schedule 13.02.2019
comment
Я протестировал производительность std::strtod в сравнении с boost::spirit::x3::double_ (микротест с нониусом), и для этого теста требуется примерно на 50% больше времени. Также он использует errno... Далее попробую std::from_chars и опубликую результаты здесь   -  person mgr    schedule 13.02.2019


Ответы (1)


В конце концов, я создал собственный метод синтаксического анализа, который сначала использует boost::spirit::x3::int_ для экспоненциальной части строкового представления двойного числа (если оно существует) и возвращает значение, если экспонента не удовлетворяет границам двойного тип. После этого я вызываю парсер boost::spirit::x3::double_ для допустимых строк.

person mgr    schedule 25.09.2019