Tôi cần lưu trữ gấp đôi như một chuỗi. Tôi biết tôi có thể sử dụng printf
nếu tôi muốn hiển thị nó, nhưng tôi chỉ muốn lưu trữ nó trong một biến chuỗi để tôi có thể lưu trữ nó trong bản đồ sau này (dưới dạng giá trị , không phải là khóa ).
Tôi cần lưu trữ gấp đôi như một chuỗi. Tôi biết tôi có thể sử dụng printf
nếu tôi muốn hiển thị nó, nhưng tôi chỉ muốn lưu trữ nó trong một biến chuỗi để tôi có thể lưu trữ nó trong bản đồ sau này (dưới dạng giá trị , không phải là khóa ).
Câu trả lời:
Cách tăng (tm) :
std::string str = boost::lexical_cast<std::string>(dbl);
Cách tiêu chuẩn C ++ :
std::ostringstream strs;
strs << dbl;
std::string str = strs.str();
Lưu ý : Đừng quên#include <sstream>
#include <sstream>
theo cách của c ++ :)
#include <sstream>
, bạn sẽ gặp lỗi "loại không đầy đủ không được phép."
// 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 <<
trả về std::ostream&
thay vì a stringstream&
.
to_string
chức năng. Tôi đang sử dụng Microsoft Visual C ++ 2013.
Cách C ++ 11 tiêu chuẩn (nếu bạn không quan tâm đến định dạng đầu ra):
#include <string>
auto str = std::to_string(42.5);
to_string
là một chức năng thư viện mới được giới thiệu trong N1804 (r0), N1982 (r1) và N2408 (r2) " Truy cập số đơn giản ". Ngoài ra còn có stod
chức năng thực hiện các hoạt động ngược lại.
Nếu bạn muốn có một định dạng đầu ra khác hơn "%f"
, hãy sử dụng snprintf
hoặc ostringstream
các phương thức như được minh họa trong các câu trả lời khác.
8.0
nó cung cấp cho tôi chuỗi "8.000000"
, trong khi đó "8"
sẽ hoàn toàn ổn.
1e-9
sản xuất0.000000
Nếu bạn sử dụng C ++, hãy tránh sprintf
. Đó là un-C ++ y và có một số vấn đề. Chuỗi dòng là phương pháp được lựa chọn, tốt nhất là được gói gọn như trong Boost.LexicalCast có thể được thực hiện khá dễ dàng:
template <typename T>
std::string to_string(T const& value) {
stringstream sstr;
sstr << value;
return sstr.str();
}
Sử dụng:
string s = to_string(42.5);
Bạn có thể sử dụng std :: to_opes trong C ++ 11
double d = 3.0;
std::string str = std::to_string(d);
std::to_string()
chỉ trả về 0,000000 và không ở dạng khoa học.
sprintf
không sao, nhưng trong C ++, cách chuyển đổi tốt hơn, an toàn hơn và cũng chậm hơn một chút với stringstream
:
#include <sstream>
#include <string>
// In some function:
double d = 453.23;
std::ostringstream os;
os << d;
std::string str = os.str();
Bạn cũng có thể sử dụng Boost.LexicalCast :
#include <boost/lexical_cast.hpp>
#include <string>
// In some function:
double d = 453.23;
std::string str = boost::lexical_cast<string>(d);
Trong cả hai trường hợp, str
nên được "453.23"
sau đó. LexicalCast có một số lợi thế ở chỗ nó đảm bảo quá trình chuyển đổi hoàn tất. Nó sử dụng stringstream
s trong nội bộ.
Tôi sẽ xem xét Bộ công cụ chuỗi C ++ Libary . Chỉ cần đăng một câu trả lời tương tự ở nơi khác. Tôi đã tìm thấy nó rất nhanh và đáng tin cậy.
#include <strtk.hpp>
double pi = M_PI;
std::string pi_as_string = strtk::type_to_string<double>( pi );
Herb Sutter có một bài viết tuyệt vời về định dạng chuỗi . Tôi khuyên bạn nên đọc nó. Tôi đã liên kết nó trước đây trên SO.
Vấn đề với lexical_cast là không có khả năng xác định độ chính xác. Thông thường nếu bạn đang chuyển đổi gấp đôi thành một chuỗi, đó là vì bạn muốn in nó ra. Nếu độ chính xác quá nhiều hoặc quá ít, nó sẽ ảnh hưởng đến đầu ra của bạn.
Bạn cũng có thể sử dụng chuỗi .
Heh, tôi chỉ viết cái này (không liên quan đến câu hỏi này):
string temp = "";
stringstream outStream;
double ratio = (currentImage->width*1.0f)/currentImage->height;
outStream << " R: " << ratio;
temp = outStream.str();
/* rest of the code */
Đối với bản ghi: Trong mã của riêng tôi, tôi ủng hộ snprintf (). Với một mảng char trên ngăn xếp cục bộ, nó không hiệu quả. (Chà, có lẽ nếu bạn vượt quá kích thước mảng và lặp đi lặp lại để làm điều đó hai lần ...)
(Tôi cũng đã gói nó thông qua vsnprintf (). Nhưng điều đó khiến tôi phải kiểm tra một số loại. Yelp nếu bạn muốn mã ...)
Hãy xem sprintf()
và gia đình.
Normaly cho các hoạt động này, bạn phải sử dụng các hàm ecvt, fcvt hoặc 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
Là một chức năng:
void double_to_char(double f,char * buffer){
gcvt(f,10,buffer);
}
Bạn có thể thử một phong cách nhỏ gọn hơn:
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();
Sử dụng to_string()
.
thí dụ :
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string pi = "pi is " + to_string(3.1415926);
cout<< "pi = "<< pi << endl;
return 0;
}
tự chạy: http://ideone.com/7ejfaU
Đây cũng có sẵn:
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);