среда, 15 февраля 2012 г.

C++. Конвертирование строки в число

Решением может быть такая функция:
#include <string>
#include <sstream>

using std::string;
using std::istringstream;

...

double stringToDouble(const string &str) {

    istringstream stm;
    double val = 0;

    stm.str(str);
    stm >> val;

    return val;
}

...

4 комментария:

  1. наверное многие слышали(или просто встречали) про boost.lexical_cast. я его юзаю очень часто. но у меня постоянно было(не понятно откуда) мнение о том, что рантайм оверхед этого шаблона необычайно велик. по этому, в задачах критичных к производительности я использовал Си`шные функции.
    неделю назад, я каким-то невероятным образом наткнулся на страницу сравнения разных способов преобразования типов написанную самим авторов boost.lexical_cast(http://www.boost.org/doc/libs/1_49_0/doc/html/boost_lexical_cast/performance.html), и был дико удивлен тем, что boost.lexical_cast в 98% работает быстрее всех остальных способов преобразования, а иногда до 20ти раз быстрее.

    все, везде только его =)

    ОтветитьУдалить
  2. Ничего себе... Надо будет обязательно затестить.

    ОтветитьУдалить
  3. Что-то я явно переутомился на этой неделе...

    ОтветитьУдалить
  4. Что-то у меня так и не получилось затестить lexical_cast. Не могу понять в чем дело. Почему функция stringToDouble работает, а при использовании str2dbl, после запуска программы, сразу же получаю такое сообщение:

    terminate called after throwing an instance of 'boost::exception_detail::clone_impl >'
    what(): bad lexical cast: source type value could not be interpreted as target
    Аварийный останов

    Вот, собственно, сами функции:

    double stringToDouble(const string &str) {

    istringstream stm;
    double val = 0;

    stm.str(str);
    stm >> val;

    return val;
    }

    double str2dbl(const string &str) {

    return lexical_cast(str);
    }

    Что за дела?...

    Плохо, что в комментариях нельзя исходный код нормально оформить (

    ОтветитьУдалить