Как я могу преобразовать двойной в строку в C ++? - PullRequest
157 голосов
/ 01 декабря 2008

Мне нужно хранить двойной как строку. Я знаю, что могу использовать printf, если я хочу отобразить его, но я просто хочу сохранить его в строковой переменной, чтобы позже я мог сохранить его на карте (как значение , а не ключ ).

Ответы [ 17 ]

177 голосов
/ 01 декабря 2008
// The C way:
char buffer[32];
snprintf(buffer, sizeof(buffer), "%g", myDoubleVar);

// The C++03 way:
std::ostringstream sstream;
sstream << myDoubleVar;
std::string varAsString = sstream.str();

// The C++11 way:
std::string varAsString = std::to_string(myDoubleVar);

// The boost way:
std::string varAsString = boost::lexical_cast<std::string>(myDoubleVar);
173 голосов
/ 01 декабря 2008

повышение (тм) способ:

std::string str = boost::lexical_cast<std::string>(dbl);

Стандартный C ++ способ:

std::ostringstream strs;
strs << dbl;
std::string str = strs.str();

Примечание : не забудьте #include <sstream>

112 голосов
/ 04 ноября 2011

Способ Стандартный C ++ 11 (если вам не нужен формат вывода):

#include <string>

auto str = std::to_string(42.5); 

to_string - это новая библиотечная функция, представленная в N1803 (r0), N1982 (r1) и N2408 (r2 ) " Простой числовой доступ ". Также имеется функция stod для выполнения обратной операции.

Если вы хотите использовать формат вывода, отличный от "%f", используйте методы snprintf или ostringstream, как показано в других ответах.

24 голосов
/ 01 декабря 2008

Если вы используете C ++, избегайте sprintf. Это не-C ++ y и имеет несколько проблем. Строковые потоки - это метод выбора, предпочтительно инкапсулированный, как в Boost.LexicalCast , который можно сделать довольно легко:

template <typename T>
std::string to_string(T const& value) {
    stringstream sstr;
    sstr << value;
    return sstr.str();
}

Использование:

string s = to_string(42.5);
16 голосов
/ 27 марта 2017

Вы можете использовать std :: to_string в C ++ 11

double d = 3.0;
std::string str = std::to_string(d);
10 голосов
/ 01 декабря 2008

sprintf нормально, но в C ++ лучший, более безопасный и немного медленный способ преобразования - stringstream:

#include <sstream>
#include <string>

// In some function:
double d = 453.23;
std::ostringstream os;
os << d;
std::string str = os.str();

Вы также можете использовать Boost.LexicalCast :

#include <boost/lexical_cast.hpp>
#include <string>

// In some function:
double d = 453.23;
std::string str = boost::lexical_cast<string>(d);

В обоих случаях str должен быть "453.23" после. LexicalCast имеет некоторые преимущества в том, что он обеспечивает завершение преобразования. Он использует stringstream s внутри.

10 голосов
/ 08 июня 2015

Я бы посмотрел на C ++ String Toolkit Libary . Просто опубликовал аналогичный ответ в другом месте. Я нашел это очень быстро и надежно.

#include <strtk.hpp>

double pi = M_PI;
std::string pi_as_string  = strtk::type_to_string<double>( pi );
7 голосов
/ 01 декабря 2008

У Херба Саттера есть отличная статья о форматировании строк . Я рекомендую прочитать это. Я связал его раньше на SO.

6 голосов
/ 22 сентября 2009

Проблема с lexical_cast заключается в невозможности определить точность. Обычно, если вы конвертируете double в строку, это потому, что вы хотите распечатать ее Если точность слишком велика или слишком мала, это повлияет на ваш вывод.

4 голосов
/ 01 декабря 2008

Вы также можете использовать stringstream .

...