ฉันต้องการเก็บ double เป็นสตริง ฉันรู้ว่าฉันสามารถใช้งานได้printf
ถ้าฉันต้องการแสดง แต่ฉันต้องการเก็บไว้ในตัวแปรสตริงเพื่อที่ฉันจะสามารถเก็บไว้ในแผนที่ได้ในภายหลัง (ตามค่าไม่ใช่กุญแจ )
ฉันต้องการเก็บ double เป็นสตริง ฉันรู้ว่าฉันสามารถใช้งานได้printf
ถ้าฉันต้องการแสดง แต่ฉันต้องการเก็บไว้ในตัวแปรสตริงเพื่อที่ฉันจะสามารถเก็บไว้ในแผนที่ได้ในภายหลัง (ตามค่าไม่ใช่กุญแจ )
คำตอบ:
วิธีเพิ่ม (tm) :
std::string str = boost::lexical_cast<std::string>(dbl);
วิธี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&
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) " Simple Numeric Access " นอกจากนี้ยังมีstod
ฟังก์ชั่นเพื่อทำการย้อนกลับ
หากคุณต้องการมีรูปแบบผลลัพธ์ที่แตกต่างจาก"%f"
ใช้snprintf
หรือostringstream
วิธีการตามที่แสดงในคำตอบอื่น ๆ
8.0
มันให้สตริง"8.000000"
ในขณะที่"8"
จะดีอย่างสมบูรณ์
1e-9
ผลิต0.000000
ถ้าคุณใช้ภาษา C ++, sprintf
หลีกเลี่ยง มันไม่ได้ใช้ภาษา C ++ และมีปัญหาหลายอย่าง 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
ภายใน
ฉันจะมองไปที่C ++ String Toolkit ไลบรารี เพิ่งโพสต์คำตอบที่คล้ายกันที่อื่น ฉันพบว่ามันรวดเร็วและเชื่อถือได้
#include <strtk.hpp>
double pi = M_PI;
std::string pi_as_string = strtk::type_to_string<double>( pi );
Sutter สมุนไพรมีดีบทความเกี่ยวกับการจัดรูปแบบสตริง ฉันแนะนำให้อ่าน ฉันเคยเชื่อมโยงมันมาก่อนดังนั้น
ปัญหาของ lexical_cast คือการไม่สามารถกำหนดความแม่นยำได้ โดยปกติถ้าคุณแปลงคู่เป็นสตริงเป็นเพราะคุณต้องการพิมพ์ออกมา หากความแม่นยำมีมากหรือน้อยเกินไปก็จะส่งผลต่อผลลัพธ์ของคุณ
คุณสามารถใช้สตริงสตรีม
เฮ้ฉันเพิ่งเขียนสิ่งนี้ (ไม่เกี่ยวข้องกับคำถามนี้):
string temp = "";
stringstream outStream;
double ratio = (currentImage->width*1.0f)/currentImage->height;
outStream << " R: " << ratio;
temp = outStream.str();
/* rest of the code */
คุณอาจต้องการอ่านโพสต์ก่อนหน้าของฉันใน SO (รุ่น Macro'ed ที่มีวัตถุ ostringstream ชั่วคราว)
สำหรับบันทึก: ในรหัสของฉันฉันชอบ snprintf () ด้วยอาเรย์ถ่านบนสแต็คท้องถิ่นมันไม่มีประสิทธิภาพ (เอาละบางทีถ้าคุณมีขนาดใหญ่เกินขนาดและวนซ้ำเพื่อทำสอง ...
(ฉันยังห่อมันด้วย vsnprintf () แต่นั่นทำให้ฉันต้องใช้การตรวจสอบบางอย่าง Yelp ถ้าคุณต้องการรหัส ... )
ลองดูที่sprintf()
และครอบครัว
Normaly สำหรับการดำเนินการนี้คุณต้องใช้ฟังก์ชัน 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");