Как преобразовать double в строку в С++?

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

Ответ 1

Способ повышения (tm):

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

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

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

Примечание. Не забывайте #include <sstream>

Ответ 2

// 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);

Ответ 3

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

#include <string>

auto str = std::to_string(42.5); 

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

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

Ответ 4

Если вы используете С++, избегайте sprintf. Это un-С++ 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);

Ответ 5

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

double d = 3.0;
std::string str = std::to_string(d);

Ответ 6

sprintf в порядке, но на С++ лучший, более безопасный, а также немного медленный способ преобразования - с 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 внутренне.

Ответ 7

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

#include <strtk.hpp>

double pi = M_PI;
std::string pi_as_string  = strtk::type_to_string<double>( pi );

Ответ 9

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

Ответ 10

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

Ответ 11

Хех, я просто написал это (не связанный с этим вопросом):

string temp = "";
stringstream outStream;
double ratio = (currentImage->width*1.0f)/currentImage->height;
outStream << " R: " << ratio;
temp = outStream.str();

/* rest of the code */

Ответ 12

Вы можете прочитать мою предыдущую публикацию на SO. (Версия Macro'ed с временным объектом ostringstream.)

Для записи: В моем собственном коде я предпочитаю snprintf(). С массивом char в локальном стеке это не так неэффективно. (Ну, может быть, если вы превысили размер массива и зациклировали, чтобы сделать это дважды...)

(Я также обернул его через vsnprintf(), но это меня проверяет некоторыми типами. Yelp, если вы хотите код...)

Ответ 13

Нормальный для этих операций вы должны использовать функции ecvt, fcvt или gcvt:

/* gcvt example */
#include <stdio.h>
#include <stdlib.h>

main ()
{
  char buffer [20];
  gcvt (1365.249,6,buffer);
  puts (buffer);
  gcvt (1365.249,3,buffer);
  puts (buffer);
  return 0;
}

Output:
1365.25
1.37e+003   

Как функция:

void double_to_char(double f,char * buffer){
  gcvt(f,10,buffer);
}

Ответ 14

Взгляните на sprintf() и на семейство.

Ответ 15

Вы можете попробовать более компактный стиль:

std::string number_in_string;

double number_in_double;

std::ostringstream output;

number_in_string = (dynamic_cast< std::ostringstream*>(&(output << number_in_double <<

std::endl)))->str(); 

Ответ 16

Используйте to_string().
Пример:

#include <iostream>   
#include <string>  

using namespace std;
int main ()
{
    string pi = "pi is " + to_string(3.1415926);
    cout<< "pi = "<< pi << endl;

  return 0;
}

запустите его самостоятельно: http://ideone.com/7ejfaU
Они также доступны:

string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);

Ответ 17

Вы можете конвертировать любую вещь в любую вещь, используя эту функцию:

template<class T = std::string, class U>
T to(U a) {
    std::stringstream ss;
    T ret;
    ss << a;
    ss >> ret;
    return ret;
};

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

std::string str = to(2.5);
double d = to<double>("2.5");