سؤال

أحتاج إلى تخزين مزدوج كسلسلة.أعلم أنه يمكنني استخدامها printf إذا كنت أرغب في عرضه، ولكنني أريد فقط تخزينه في متغير سلسلة حتى أتمكن من تخزينه في الخريطة لاحقًا (مثل قيمة, ، وليس مفتاح).

هل كانت مفيدة؟

المحلول

و <م> دفعة (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 هي وظيفة المكتبة الجديدة التي أدخلت في <أ href = ل "http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1803.html" يختلط = "noreferrer"> N1803 (R0)، <أ href = على "HTTP : //www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1982.html "يختلط =" noreferrer "> N1982 (R1) و <لأ href =" HTTP: / /www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2408.html "يختلط =" noreferrer "> N2408 (R2)" بسيط الرقمية الوصول ". هناك أيضا وظيفة stod لتنفيذ العملية العكسية.

إذا كنت لا تريد أن يكون لها تنسيق الإخراج مختلفة من "%f"، استخدم snprintf أو ostringstream الطرق كما هو موضح في إجابات أخرى.

إذا كنت تستخدم 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);

يمكنك استخدام الأمراض المنقولة جنسيا::to_string في سي++ 11

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

و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 لديها بعض المزايا من حيث أنه يضمن التحول الكامل. ويستخدم stringstreams داخليا.

وأود أن ننظر في C ++ سلسلة أدوات Libary . مجرد نشر إجابة مماثلة في أماكن أخرى. وقد وجدت أنه سريع جدا وموثوق بها.

#include <strtk.hpp>

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

وعشب سوتر ديه على سلسلة تنسيق . أوصي قراءته. لقد ربطه قبل على 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 */

قد ترغب في قراءة مشاركتي مسبق على SO. (الإصدار Macro'ed مع كائن ostringstream مؤقت.)

لسجل: في التعليمات البرمجية بلدي، فأنا أؤيد snprintf (). مع مجموعة شار على كومة المحلي، انها ليست فعالة. (حسنا، ربما إذا تجاوز حجم مجموعة ويحلق على القيام بذلك مرتين ...)

و(لقد ملفوفة أيضا عبر vsnprintf (). ولكن هذا يكلف لي بعض نوع التحقق. الصرخة إذا كنت تريد رمز ...)

ونلقي نظرة على 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