Мені потрібно зберігати дубль як рядок. Я знаю, що можу використати, printf
якщо хотів його відобразити, але просто хочу зберігати його в рядковій змінній, щоб згодом я міг зберігати її на карті (як значення , а не як ключ ).
Мені потрібно зберігати дубль як рядок. Я знаю, що можу використати, printf
якщо хотів його відобразити, але просто хочу зберігати його в рядковій змінній, щоб згодом я міг зберігати її на карті (як значення , а не як ключ ).
Відповіді:
Спосіб збільшення (тм) :
std::string str = boost::lexical_cast<std::string>(dbl);
У Standard C ++ спосіб:
std::ostringstream strs;
strs << dbl;
std::string str = strs.str();
Примітка . Не забувайте#include <sstream>
#include <sstream>
спосіб c ++ :)
#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);
operator <<
повертає std::ostream&
скоріше ніж a stringstream&
.
to_string
функція. Я використовую Microsoft Visual C ++ 2013.
Стандарт C ++ 11 спосіб (якщо ви не дбаєте про формат виведення):
#include <string>
auto str = std::to_string(42.5);
to_string
- це нова функція бібліотеки, запроваджена в N1803 (r0), N1982 (r1) та N2408 (r2) " Простий числовий доступ ". Існує також stod
функція виконання зворотної операції.
Якщо ви хочете мати інший вихідний формат, ніж "%f"
скористайтеся методами snprintf
або ostringstream
методами, як показано в інших відповідях.
8.0
він дає мені рядок "8.000000"
, хоча це "8"
було б чудово.
1e-9
виробляє0.000000
Якщо ви використовуєте C ++, уникайте sprintf
. Це un-C ++ y і має кілька проблем. Stringstreams - це метод вибору, бажано інкапсульований як у 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);
Ви можете використовувати std :: to_string в C ++ 11
double d = 3.0;
std::string str = std::to_string(d);
std::to_string()
просто поверталися 0,000000, а не в науковій формі.
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 внутрішньо.
Я б подивився на бібліотеку C ++ String Toolkit Libary . Щойно розмістив подібну відповідь в іншому місці. Я знайшов це дуже швидко і надійно.
#include <strtk.hpp>
double pi = M_PI;
std::string pi_as_string = strtk::type_to_string<double>( pi );
Herb Sutter має чудову статтю про форматування рядків . Рекомендую прочитати. Я пов’язував це раніше на SO.
Проблема з lexical_cast полягає в неможливості визначити точність. Зазвичай, якщо ви перетворюєте подвійний на рядок, це тому, що ви хочете роздрукувати його. Якщо точність занадто велика або занадто мала, це вплине на результат.
Ви також можете використовувати stringstream .
Хе, я щойно написав це (не пов'язане з цим питанням):
string temp = "";
stringstream outStream;
double ratio = (currentImage->width*1.0f)/currentImage->height;
outStream << " R: " << ratio;
temp = outStream.str();
/* rest of the code */
Для запису: У власному коді я віддаю перевагу 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");