float <-> std :: string альтернатива преобразования? - PullRequest
8 голосов
/ 26 сентября 2011

есть ли альтернатива atof, strtod, lexical_cast, stringstream или sprintf?

то есть:

  1. быстро
  2. C ++ (std::string вместо char*)
  3. безопасно (нет риска переполнения буфера)
  4. действует (вернуть NaN, если преобразование не может быть выполнено)
  5. нет внешней библиотеки (независимой)

Я предпочитаю больше, как , это , простая функция, оптимизированная, и в точку

причина:

  • atof и strtod - это функция C, и они не возвращают NaN при сбое, я предпочитаю работать с std::string, поэтому я просто спрашиваю, кто-нибудь уже пишет какую-нибудь оболочку для std::string, которую я могу использовать (если не возражаешь).
  • lexical_cast имеет буст-зависимость
  • stringstream медленно
  • sprintf имеет риск переполнения буфера и его функцию C

Ответы [ 3 ]

1 голос
/ 30 сентября 2011

Если вы хотите преобразовать числовые типы в std :: string, в последнем стандарте доступна функция std::to_string.

К сожалению, как я недавно выяснил, в Visual Studio 2010 он несколько ограничен, поскольку для него доступно только три перегрузки; long double, long long и unsigned long long. Это вызывает проблемы при попытке использовать их из шаблонов.

1 голос
/ 26 сентября 2011

Я бы посмотрел на Boost Spirit

По крайней мере, тесты форматировщиков (то есть float -> string) последовательно получаются какtop-of-the-the-bill * 1 *

Также точную спецификацию формата ввода и семантику при разборе можно очень легко настроить с помощью класса политики.


Вот мое абсолютное минимальное использование qi :: any_real_parser <> и список зависимостей, к которым он касается:

#include <boost/spirit/include/qi_real.hpp>

namespace qi = boost::spirit::qi;

int main()
{
    const char input[] = "3.1415926";
    const char *f(input);
    const char *l(f+strlen(input));

    qi::any_real_parser<double> x;
    double parsed;
    x.parse(f, l, qi::unused, qi::unused, parsed);

    return 0;
}

  • буст / концепция
  • буст / конфигурация
  • буст / детализация
  • буст / исключение
  • буст / синтез
  • буст/ iterator
  • boost / math
  • boost / mpl
  • boost / опционально
  • boost / препроцессор
  • boost / proto
  • boost / range
  • boost / regex
  • boost / spirit
  • boost / typeof
  • boost / type_traits
  • boost /Утилита
  • буст / вариант

выровнятьd_storage.hpp, assert.hpp, blank_fwd.hpp, blank.hpp, call_traits.hpp, checked_delete.hpp, concept_check.hpp, config.hpp, cstdint.hpp, current_function.hpp, foreach_fwd.hpp, foreach.hpp, get_pointer.HPP, implicit_cast.hpp, iterator.hpp, limits.hpp, math_fwd.hpp, next_prior.hpp, noncopyable.hpp, none.hpp, none_t.hpp, optional.hpp, ref.hpp, static_assert.hpp, swap.hpp,throw_exception.hpp, type.hpp, utility.hpp, variable.hpp, version.hpp

1 например, http://www.boost.org/doc/libs/1_47_0/libs/spirit/doc/html/spirit/karma/performance_measurements/numeric_performance/double_performance.html

0 голосов
/ 26 сентября 2011

Библиотека fast format должна быть способна выполнять те преобразования, которые вы ищете, по крайней мере, для написания плавающего числа.Однако он не обрабатывает разбор числа с плавающей точкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...