मैं C ++ में एक डबल को एक स्ट्रिंग में कैसे बदलूं?


171

मुझे एक स्ट्रिंग के रूप में एक डबल स्टोर करने की आवश्यकता है। मुझे पता है कि printfअगर मैं इसे प्रदर्शित करना चाहता हूं तो मैं इसका उपयोग कर सकता हूं, लेकिन मैं इसे एक स्ट्रिंग चर में संग्रहीत करना चाहता हूं ताकि मैं इसे बाद में एक मानचित्र में संग्रहीत कर सकूं ( मान के रूप में , कुंजी नहीं )।


2
आपके प्रश्न का उत्तर देने के लिए एक प्रश्न: आप इसे एक मानचित्र में संग्रहीत करने के लिए एक स्ट्रिंग में डबल मान क्यों जमा कर रहे हैं? क्या आप कुंजी के रूप में स्ट्रिंग-इफाइड डबल का उपयोग करने जा रहे हैं? यदि नहीं, तो क्यों नहीं डबल को छोड़ दें?
मैट मैकलेलन 21

1
दिलचस्प बिंदु। मानचित्र कुंजी के रूप में डबल का उपयोग करना जोखिम से भरा हो सकता है, हालांकि, फ्लोटिंग पॉइंट वैल्यू पर सटीक तुलना हमेशा होती है। एक स्ट्रिंग प्रतिनिधित्व पर अनुक्रमण समस्या से बचा जाता है।
फ्रेड लार्सन 21

2
इसे आखिर क्यों बदला? इसे मैप में डबल के रूप में संग्रहीत करें, और रूपांतरण को इससे और इसके लिए टालें।
EvilTeach

3
यह अभी भी वस्तुओं के लिए एक कॉल की तरह लगता है। एक संघ काम करेगा। प्रत्येक वस्तु में विभिन्न मूल्यों को सम्मिलित करने के लिए है, और यह स्वयं को मान्य है।
EvilTeach

2
मेरे पास फ़ाइल में केवल नाम / मान जोड़े का एक गुच्छा है। यह वस्तुओं के लिए कॉल नहीं करता है।
छिपकली

जवाबों:


183

को बढ़ावा देने (टीएम) रास्ता:

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

स्टैंडर्ड सी ++ रास्ता:

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

नोट : मत भूलना#include <sstream>


3
मुझे लगता है कि बढ़ावा :: lexical_cast बहुत अधिक मानक सी ++ तरीका है, बस आपके लिए अच्छी तरह से पैक किया गया है। BTW, लिट, आपके पास वहां एक छोटा टाइपो है - "बूट: लेक्सिकल_कास्ट"।
फ्रेड लार्सन

2
बढ़ावा देना :: lexical_cast केवल एक साधारण आवरण नहीं है जो स्ट्रीपस्ट कोड के आसपास है। कई रूपांतरण रूटीन इनलाइन लागू किए गए हैं। इस पृष्ठ के निचले भाग पर प्रदर्शन माप के अनुसार ( बूस्ट। ओड / एलोक / एलिब्स / १_४0/०/ एलिब्स / एंकोवर्जन / प्लेक्सिअल_कैस्ट ), बूस्ट :: लेक्सिकल_कास्ट स्ट्रीस्ट्रीम की तुलना में तेज़ है और, ज्यादातर मामलों में, स्कैनफ़ / से तेज़ प्रिंटफ
फेर्रूकियो

1
@ किसने कहा कि यह एक साधारण आवरण था? और लिंक प्रदान करने के लिए धन्यवाद, मैंने वास्तव में यह सोचा था कि यह कम या ज्यादा एक साधारण आवरण है :)
जोहान्स स्काउब -

27
#include <sstream>सी ++ रास्ते के लिए मत भूलना :)
व्लाद

3
प्रलेखन के लिए, यदि आप नहीं करते हैं #include <sstream>, तो आपको एक त्रुटि मिलेगी "अपूर्ण प्रकार की अनुमति नहीं है।"
ट्रेवर सुलिवन

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

1
आपका सी ++ तरीका काम नहीं होगा क्योंकि operator <<रिटर्न एक std::ostream&एक के बजाय stringstream&
कोनराड रुडोल्फ

ऐसा लगता है कि मेरी स्ट्रिंगस्ट्रीम थोड़ी रस्टी हैं, मैं ओल के सी तरीके पसंद करता हूं। अब निश्चित (मुझे आशा है)।
एडम रोसेनफील्ड

आपके C कोड ने मुझे पहले ही फेंक दिया। मैंने आपको सही विकल्प देने के लिए अभी भी उत्थान किया है।
छिपकली

2
सी रास्ते सहित के लिए upvote। बस मुझे इतना साफ लगता है।
नीलोन 28:13

11
C ++ 11 तरीके के लिए अपग्रेड किया गया। मैं C ++ में नया हूं, और महसूस नहीं किया कि कोई to_stringफ़ंक्शन था । मैं Microsoft Visual C ++ 2013 का उपयोग कर रहा हूं।
ट्रेवर सुलिवन

123

स्टैंडर्ड सी ++ 11 रास्ता (आप उत्पादन प्रारूप के बारे में परवाह नहीं है):

#include <string>

auto str = std::to_string(42.5); 

to_stringN1803 (r0), N1982 (r1) और N2408 (r2) " सिंपल न्यूमेरिक एक्सेस " में पेश किया गया एक नया लाइब्रेरी फंक्शन है । stodरिवर्स ऑपरेशन करने के लिए फ़ंक्शन भी हैं ।

यदि आप किसी अन्य आउटपुट स्वरूप से भिन्न होना चाहते हैं, तो अन्य उत्तर में दिए गए तरीकों या विधियों का "%f"उपयोग करें ।snprintfostringstream


3
अरे हां, प्रिये। to_string और Stod दोनों Visual Studio 11. में काम करते हैं
BSalita

हे प्यारे बच्चे ... to_string VisualStudio 2010 में काम नहीं करता): वह, या मुझे नहीं पता कि मैं क्या कर रहा हूं (बहुत संभव है)
chessofnerd

1
यह अधिक होना चाहिए, क्योंकि यह अधिक आधुनिक है!
gsamaras

1
क्या इस फ़ंक्शन को बनाने के लिए ज़रूरत से ज़्यादा डेसीमल जोड़ने का कोई तरीका नहीं है? जब मैं डबल कन्वर्ट करता हूं तो 8.0यह मुझे स्ट्रिंग देता है "8.000000", जबकि "8"यह पूरी तरह से ठीक होगा।
हैलोगूडीबाई

1
यह छोटी संख्या के लिए काम नहीं करता है ... उदाहरण के लिए: का 1e-9उत्पादन0.000000
user3728501

24

यदि आप C ++ का उपयोग करते हैं, तो बचें sprintf। यह un-C ++ y है और इसमें कई समस्याएं हैं। स्ट्रिंगस्ट्रीम पसंद का तरीका है, बूस्ट.लॉक्सीलकैस्ट के रूप में अधिमानतः इनकैप्सुलेट किया जाता है जिसे काफी आसानी से किया जा सकता है:

template <typename T>
std::string to_string(T const& value) {
    stringstream sstr;
    sstr << value;
    return sstr.str();
}

उपयोग:

string s = to_string(42.5);

24

आप C ++ 11 में std :: to_string का उपयोग कर सकते हैं

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

मेरी संख्या वास्तव में छोटी थी, और std::to_string()बस 0.000000 वापस आ गई और वैज्ञानिक रूप में नहीं।
इरफान

11

sprintfठीक है, लेकिन सी ++ में, बेहतर, सुरक्षित, और रूपांतरण करने का थोड़ा धीमा तरीका है 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आंतरिक रूप से उपयोग करता है ।



7

हर्ब सटर का स्ट्रिंग प्रारूपण पर एक उत्कृष्ट लेख है । मैं इसे पढ़ने की सलाह देता हूं। मैंने इसे पहले SO पर लिंक किया है


1
यह एक उत्तर नहीं है, लेकिन सवाल पर बहुत उपयोगी टिप्पणी करेगा।
लिमिटेड प्रायश्चित 19

6

Lexical_cast के साथ समस्या सटीक परिभाषित करने में असमर्थता है। आम तौर पर यदि आप एक डबल को एक स्ट्रिंग में परिवर्तित कर रहे हैं, तो यह इसलिए है क्योंकि आप इसे प्रिंट करना चाहते हैं। यदि परिशुद्धता बहुत अधिक या बहुत कम है, तो यह आपके आउटपुट को प्रभावित करेगा।



4

हे, मैंने इसे लिखा है (इस प्रश्न से असंबंधित):

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

/* rest of the code */

2

आप SO पर मेरी पूर्व पोस्टिंग पढ़ना चाह सकते हैं। (अस्थाई अस्थि-पंजर ऑब्जेक्ट के साथ मैक्रो'ड संस्करण।)

रिकॉर्ड के लिए: अपने स्वयं के कोड में, मैं snprintf () का पक्ष लेता हूं। स्थानीय ढेर पर एक चार सरणी के साथ, यह अक्षम नहीं है। (ठीक है, हो सकता है कि यदि आप सरणी का आकार पार कर लें और इसे दो बार करने के लिए पाला गया हो ...)

(मैंने इसे vsnprintf () के माध्यम से भी लपेटा है। लेकिन मुझे कुछ प्रकार की जाँच की लागत है। येल्प यदि आप कोड चाहते हैं ...)


2

एक नजर sprintf()और परिवार पर।


2
मैंने प्रिंटफ का उल्लेख किया है क्योंकि googling ने लेखों का एक समूह बनाया है जो एक डबल से एक स्ट्रिंग में बदलने के लिए कहते हैं जिसे आप प्रिंटफ का उपयोग करते हैं। वे यह धारणा बनाते हैं कि केवल एक चीज जो आप कर सकते हैं वह है मुद्रण, जो मेरे मामले में झूठी है।
छिपकली

आप वोट क्यों देते हैं -1 मुझे लगता है कि स्प्रिंटफ अच्छा है। @BilltheLizard, स्प्रिंट एक चार्ट * स्क्रीन पर कुछ प्रिंट करता है। किसी ने उत्तर दिया सी विधि अभी भी बहुत वोट मिली।
दुनियादार

2

इस ऑपरेशन के लिए सामान्य तौर पर आपको 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);
}


0

का उपयोग करें 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);

0

आप इस फ़ंक्शन का उपयोग करके किसी भी चीज़ को किसी भी चीज़ में बदल सकते हैं:

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");
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.