Как преобразовать двойное число в строку в C++?

StackOverflow https://stackoverflow.com/questions/332111

  •  22-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Способ boost (tm) :

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

Стандартный C ++ :

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

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

Другие советы

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

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

#include <string>

auto str = std::to_string(42.5); 

to_string - новая библиотека функция, представленная в N1803 (r0) , N1982 (r1) и < a href = "http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2408.html" rel = "noreferrer"> N2408 (r2) " Простой числовой доступ " ;. Также есть функция stod для выполнения обратной операции.

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

Если вы используете 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);

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 внутри.

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

#include <strtk.hpp>

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

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

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

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

Хех, я только что написал это (не имеет отношения к этому вопросу):

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

/* rest of the code */

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

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

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

Посмотрите на sprintf () и семью.

Обычно для этих операций вы должны использовать функции 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);
}

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

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

Используйте 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);

С помощью этой функции вы можете преобразовать любую вещь во что угодно:

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");
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top