मैं कन्वर्ट करने के लिए कोशिश कर रहा हूँ std::stringकरने के लिए float/double। मैंने कोशिश की:
std::string num = "0.6";
double temp = (double)atof(num.c_str());
लेकिन यह हमेशा शून्य देता है। कोई और तरीका?
मैं कन्वर्ट करने के लिए कोशिश कर रहा हूँ std::stringकरने के लिए float/double। मैंने कोशिश की:
std::string num = "0.6";
double temp = (double)atof(num.c_str());
लेकिन यह हमेशा शून्य देता है। कोई और तरीका?
जवाबों:
std::string num = "0.6";
double temp = ::atof(num.c_str());
क्या यह मेरे लिए है, यह एक स्ट्रिंग को डबल में बदलने के लिए एक वैध C ++ सिंटैक्स है।
आप इसे स्ट्रीस्टस्ट या बूस्ट :: लेक्सिकल_कास्ट के साथ कर सकते हैं, लेकिन वे एक प्रदर्शन दंड के साथ आते हैं।
अहा आपके पास एक Qt प्रोजेक्ट है ...
QString winOpacity("0.6");
double temp = winOpacity.toDouble();
अतिरिक्त ध्यान दें:
यदि इनपुट डेटा ए है const char*, QByteArray::toDoubleतो तेज़ होगा।
मानक पुस्तकालय (C ++ 11) वांछित कार्यक्षमता प्रदान करता है std::stod:
std::string s = "0.6"
std::wstring ws = "0.7"
double d = std::stod(s);
double dw = std::stod(ws);
आम तौर पर अधिकांश अन्य बुनियादी प्रकारों के लिए, देखें <string>। सी स्ट्रिंग्स के लिए कुछ नई विशेषताएं भी हैं। देख<stdlib.h>
ostringstreamअपने आप में टाइप करने के लिए बहुत लंबा था, अकेले इस्तेमाल करते हैं ..
लेक्सिकल कास्ट बहुत अच्छी है।
#include <boost/lexical_cast.hpp>
#include <iostream>
#include <string>
using std::endl;
using std::cout;
using std::string;
using boost::lexical_cast;
int main() {
string str = "0.6";
double dub = lexical_cast<double>(str);
cout << dub << endl;
}
try { ... boost::lexical_cast ... } catch (std::exception const& err) { //handle excpetion }
catch ( boost::bad_lexical_cast const& err )होने के लिए, अपवाद को पकड़ने के लिए उपयोग करें।
आप std :: stringstream का उपयोग कर सकते हैं:
#include <sstream>
#include <string>
template<typename T>
T StringToNumber(const std::string& numberAsString)
{
T valor;
std::stringstream stream(numberAsString);
stream >> valor;
if (stream.fail()) {
std::runtime_error e(numberAsString);
throw e;
}
return valor;
}
उपयोग:
double number= StringToNumber<double>("0.6");
हाँ, एक शाब्दिक कलाकारों के साथ। एक स्ट्रिंगस्ट्रीम और << ऑपरेटर का उपयोग करें, या बूस्ट का उपयोग करें, वे पहले ही इसे लागू कर चुके हैं।
आपका अपना संस्करण ऐसा दिख सकता है:
template<typename to, typename from>to lexical_cast(from const &x) {
std::stringstream os;
to ret;
os << x;
os >> ret;
return ret;
}
आप बूस्ट लेक्सिकल कास्ट का उपयोग कर सकते हैं:
#include <boost/lexical_cast.hpp>
string v("0.6");
double dd = boost::lexical_cast<double>(v);
cout << dd << endl;
नोट: बढ़ावा :: लेक्सिकल_कास्ट अपवाद को फेंकता है ताकि जब आप अमान्य मान पास करें तो इससे निपटने के लिए तैयार रहें, पासिंग स्ट्रिंग का प्रयास करें ("xxx")
यदि आप सभी को बढ़ावा देने में नहीं खींचना चाहते हैं, तो इसके साथ जाओ - यह पहले strtod(3)से <cstdlib>ही एक डबल लौटाता है।
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
using namespace std;
int main() {
std::string num = "0.6";
double temp = ::strtod(num.c_str(), 0);
cout << num << " " << temp << endl;
return 0;
}
आउटपुट:
$ g++ -o s s.cc
$ ./s
0.6 0.6
$
क्यों एटॉफ़ () काम नहीं करता ... आप किस प्लेटफॉर्म / कंपाइलर पर हैं?
double myAtof ( string &num){
double tmp;
sscanf ( num.c_str(), "%lf" , &tmp);
return tmp;
}
यह उत्तर आपकी टिप्पणियों में प्रकाशित है। मुझे गहरा संदेह है कि आप परिणाम को ठीक से प्रदर्शित नहीं कर रहे हैं।
मैं एक ही बार मेरे साथ ठीक वैसा ही हुआ था। मैंने पूरा दिन यह जानने में बिताया कि मुझे 64-बिट इंट में एक खराब मूल्य क्यों मिल रहा है, केवल यह पता लगाने के लिए कि प्रिंटफ दूसरी बाइट को अनदेखा कर रहा था। तुम सिर्फ एक int की तरह 64-बिट मान को printf में पास नहीं कर सकते।
atof()मूल प्रश्न में काम क्यों नहीं किया जा रहा है: तथ्य यह है कि इसे दोगुना करने के लिए डाला जाता है मुझे संदेह करता है। कोड को बिना संकलित नहीं किया जाना चाहिए #include <stdlib.h>, लेकिन अगर संकलन संकलन को हल करने के लिए कलाकारों को जोड़ा गया था, तो atof()सही ढंग से घोषित नहीं किया गया है। यदि संकलक atof()एक इंट रिटर्न देता है, तो यह रूपांतरण चेतावनी को हल करेगा, लेकिन यह रिटर्न मान को दोहरे के रूप में मान्यता नहीं देगा ।
#include <stdlib.h>
#include <string>
...
std::string num = "0.6";
double temp = atof(num.c_str());
चेतावनियों के बिना काम करना चाहिए।
बूस्ट को समीकरण में खींचने के बजाय, आप अपने स्ट्रिंग (अस्थायी रूप से) को एक char[]और उपयोग के रूप में रख सकते हैं sprintf()।
लेकिन निश्चित रूप से अगर आप वैसे भी बूस्ट का उपयोग कर रहे हैं, तो यह वास्तव में बहुत ज्यादा नहीं है।
आप स्ट्रिंग के लिए Boost lexical_cast नहीं चाहते हैं <-> फिर भी चल बिन्दु। उपयोग के मामलों का सबसेट एकमात्र सेट है, जिसके लिए लगातार बूस्ट फंक्शन पुराने कार्यों की तुलना में बदतर है- और उन्होंने मूल रूप से अपनी सभी विफलता को केंद्रित किया, क्योंकि उनके स्वयं के प्रदर्शन के परिणाम ऐसे रूपांतरणों के लिए sscanf और printf का उपयोग करने की तुलना में 20-25X SLOWER प्रदर्शन दिखाते हैं।
इसे खुद गूगल करें। बढ़ावा देना :: lexical_cast 50 रूपांतरणों की तरह कुछ को संभाल सकता है और यदि आप फ्लोटिंग पॉइंट को शामिल करते हैं तो यह # अच्छा विकल्प के रूप में अच्छा या बेहतर है (उन सभी कार्यों के लिए एकल एपीआई होने के अतिरिक्त लाभ के साथ)। लेकिन प्रदर्शन के लिहाज से टाइटन में एक हिमखंड से टकराने वाली नाव और उसकी तरह इसे लाएं।
पुराने, समर्पित str-> डबल फ़ंक्शंस सभी 30 परसेंट (या बेहतर) की तरह 10000 पर्स कर सकते हैं। वही काम करने के लिए lexical_cast 650 ms की तरह कुछ लेता है।
मेरी समस्या:
मेरा समाधान (Windows फ़ंक्शन _wcstod_l का उपयोग करता है):
// string to convert. Note: decimal seperator is ',' here
std::wstring str = L"1,101";
// Use this for error detection
wchar_t* stopString;
// Create a locale for "C". Thus a '.' is expected as decimal separator
double dbl = _wcstod_l(str.c_str(), &stopString, _create_locale(LC_ALL, "C"));
if (wcslen(stopString) != 0)
{
// ... error handling ... we'll run into this because of the separator
}
HTH ... इस समाधान के लिए मुझे बहुत लंबा समय लगा। और मुझे अभी भी लग रहा है कि मैं स्ट्रिंग स्थानीयकरण और सामान के बारे में पर्याप्त नहीं जानता ...