2012-12-03 14 views
39

आज मैंने सी ++ 11 एसटीएल के कुछ नए कार्यों की कोशिश की और std::to_string का सामना किया।सी ++ 11 std :: to_string (डबल) - कोई पिछला शून्य शून्य नहीं

लवली, कार्यों का प्यारा सेट। सिर्फ एक डबल-से-स्ट्रिंग रूपांतरण के लिए एक stringstream वस्तु बनाना हमेशा मुझसे overkill लग रहा था, इसलिए हम अब कुछ इस तरह कर सकते हैं मुझे खुशी है:

std::cout << std::to_string(0.33) << std::endl; 

परिणाम?

0.330000 

मुझे लगता है कि पूरी तरह से सामग्री नहीं हूँ। पिछला शून्य छोड़ने के लिए std::to_string बताने का कोई तरीका है? मैंने इंटरनेट की खोज की, लेकिन जहां तक ​​मैं देख सकता हूं कि फ़ंक्शन केवल एक तर्क (परिवर्तित होने वाला मान) लेता है। स्ट्रिंगस्ट्रीम के साथ 'पुराने दिनों' में वापस, आप स्ट्रीम की चौड़ाई निर्धारित कर सकते हैं, लेकिन मैं वापस परिवर्तित नहीं करना चाहूंगा।

किसी को भी इस समस्या का सामना करने से पहले समाधान मिला है? कुछ StackOverflow खोजों में कुछ भी नहीं मिला।

(ए सी ++ 11 एसटीएल संदर्भ: http://en.cppreference.com/w/cpp/string/basic_string/to_string)

+0

@chris: 'std :: to_string' पर कॉल के बाद नहीं। यह एक स्ट्रिंग देता है, संख्या नहीं, और इसकी स्वरूपण को संशोधित करना मुश्किल लगता है। – rubenvb

+0

@ रूबेनव, शूट, मैं ठीक से सोच नहीं रहा हूं, क्या मैं ... – chris

+1

"लवली, कार्यों का प्यारा सेट। केवल एक डबल-टू-स्ट्रिंग रूपांतरण के लिए स्ट्रिंगस्ट्रीम ऑब्जेक्ट बनाना हमेशा मुझे लगता है"। और फिर आप देखते हैं कि यह वास्तव में क्यों अधिक नहीं है - यह धाराएं हैं जिनमें प्रारूप निर्दिष्ट करने के लिए सभी बुनियादी ढांचे शामिल हैं। जो भी आप चाहते हैं उसे प्राप्त करने के लिए, 'to_string' को समकक्ष एपीआई में सभी को डुप्लिकेट करना होगा। जो एक भयानक विचार नहीं हो सकता है, लेकिन यह विचार नहीं है कि समिति के साथ चला गया। 'To_string' का कारण प्यारा है कि इसमें कोई विकल्प नहीं है ;-) –

उत्तर

26

सी ++ 11 स्टैंडर्ड स्पष्ट रूप कहते हैं (21.5/7):

रिटर्न: प्रत्येक समारोह एक स्ट्रिंग उद्देश्य यह है कि sprintf फोन करके उत्पन्न होगा अपने तर्क के मूल्य का चरित्र प्रतिनिधित्व पकड़े (buf देता है, एफएमटी, वैल) "% d", "% u", "% ld", "% lu", "% lld", "% llu", "% f", "% f", या प्रारूप के विनिर्देशक के साथ "% वाम मोर्चे", क्रमशः, जहां buf कार्यों इस क्रम में घोषित करने के लिए पर्याप्त आकार

का एक आंतरिक चरित्र बफर में नामित:

string to_string(int val); 
string to_string(unsigned val); 
string to_string(long val); 
string to_string(unsigned long val); 
string to_string(long 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); 

इस प्रकार, आप परिणामस्वरूप स्ट्रिंग के स्वरूपण को नियंत्रित नहीं कर सकते हैं।

+1

सबूत के लिए +1। – chris

13

std::to_string आप प्रारूप पर कोई नियंत्रण नहीं देता है; आप sprintf के समान परिणाम प्राप्त करते हैं जो इस मामले में प्रकार ("%f") के लिए उपयुक्त प्रारूप विनिर्देशक के साथ मिलता है।

यदि आपको अधिक लचीलापन की आवश्यकता है, तो आपको 0xजैसे अधिक लचीला फ़ॉर्मेटर की आवश्यकता होगी।

+1

ठीक है, यह स्पष्ट रूप से वह उत्तर नहीं था जिसे मैं उम्मीद कर रहा था, लेकिन इसे साफ़ करने के लिए धन्यवाद :) –

3

std::to_string(double) मानक द्वारा परिभाषित किया गया है कि केवल sprintf(buf, "%f", value) द्वारा उत्पन्न किए गए वर्णों के समान अनुक्रम को वापस कर दें। और नहीं, कम नहीं, विशेष रूप से स्वरूप विनिर्देशक को ट्विक करने का कोई तरीका नहीं है। तो नहीं, ऐसा कुछ भी नहीं है जो आप कर सकते हैं।

29

यदि आप करना चाहते हैं तो पिछली शून्य को हटा दें, ठीक है, यह आसान है।

std::string str = std::to_string (f); 
str.erase (str.find_last_not_of('0') + 1, std::string::npos); 
+5

कोने के मामले को छोड़कर लगभग सही काम करता है जहां फ्लोट/डबल एक अभिन्न संख्या है। नतीजा उदाहरण है '440.', जबकि कुछ '440.0' पसंद कर सकते हैं अगर वे सुंदर आउटपुट के लिए जा रहे हैं। कुछ भी नहीं है कि आखिरी चरित्र की एक साधारण जांच हल नहीं होगी, हालांकि। –

+4

सही, इस कारण है कि मैं बड़ी लाइनों, सुरक्षा कोड समायोजित है: 'नाम स्थान util { टेम्पलेट std :: स्ट्रिंग to_string (स्थिरांक टी एंड टी) { std :: स्ट्रिंग str {std :: to_string (टी)}; int ऑफ़सेट {1}; यदि (str.find_last_not_of ('0') == str.find ('।')) { ऑफसेट = 0; } str.erase (str.find_last_not_of ('0') + ऑफ़सेट, std :: string :: npos); वापसी स्ट्र; } } ' यह एक अनावश्यक बिंदु भी हटा देता है। – antibus

-1
double val 
std::wstringstream wss; 
wss << val; 
cout << wss.str().c_str(); 
-1

बाहर छोड़ने के लिए अनुगामी शून्य:

std::ostringstream oss; 
oss << std::setprecision(8) << std::noshowpoint << double; 
std::string str = oss.str(); 

आशा है कि मदद करता है।

संबंधित मुद्दे