दशमलव अंकों की शुद्धता और संख्या को निर्दिष्ट करते हुए आप C ++ में एक फ्लोट को स्ट्रिंग में कैसे परिवर्तित करते हैं?
उदाहरण के लिए: 3.14159265359 -> "3.14"
दशमलव अंकों की शुद्धता और संख्या को निर्दिष्ट करते हुए आप C ++ में एक फ्लोट को स्ट्रिंग में कैसे परिवर्तित करते हैं?
उदाहरण के लिए: 3.14159265359 -> "3.14"
जवाबों:
उपयोग करने के लिए एक विशिष्ट तरीका होगा stringstream
:
#include <iomanip>
#include <sstream>
double pi = 3.14159265359;
std::stringstream stream;
stream << std::fixed << std::setprecision(2) << pi;
std::string s = stream.str();
तय देखें
निश्चित फ़्लोटिंग-पॉइंट नोटेशन का उपयोग करें
स्ट्रेट स्ट्रीम के
floatfield
लिए प्रारूप ध्वज सेट करता हैfixed
।जब
floatfield
सेट किया जाता हैfixed
, फ़्लोटिंग-पॉइंट वैल्यूज़ को निश्चित-पॉइंट नोटेशन का उपयोग करके लिखा जाता है: मान को दशमलव क्षेत्र में सटीक रूप से कई अंकों के साथ दर्शाया जाता है, जैसा कि सटीक फ़ील्ड (precision
) के साथ और बिना किसी एक्सपोनेंट भाग के निर्दिष्ट किया गया है ।
और असफलता ।
तकनीकी उद्देश्य के रूपांतरण के लिए , XML या JSON फ़ाइल में डेटा संग्रहीत करने के लिए, C ++ 17 to_chars को परिभाषित करता है कार्यों का परिवार।
एक आज्ञाकारी संकलक (जो हमारे पास लेखन के समय कमी है) को मानते हुए, कुछ इस तरह से माना जा सकता है:
#include <array>
#include <charconv>
double pi = 3.14159265359;
std::array<char, 128> buffer;
auto [ptr, ec] = std::to_chars(buffer.data(), buffer.data() + buffer.size(), pi,
std::chars_format::fixed, 2);
if (ec == std::errc{}) {
std::string s(buffer.data(), ptr);
// ....
}
else {
// error handling
}
इस तरह की करने के लिए प्रथागत पद्धति "प्रिंट टू स्ट्रिंग" है। C ++ में इसका मतलब है कि std::stringstream
कुछ का उपयोग करना:
std::stringstream ss;
ss << std::fixed << std::setprecision(2) << number;
std::string mystring = ss.str();
snprintf
इस मामले में बेहतर क्यों होगा ? कृपया समझाएं ... यह निश्चित रूप से तेज नहीं होगा, कम कोड का उत्पादन करेगा [मैंने एक प्रिंटफ कार्यान्वयन लिखा है, यह कोड के 2000 लाइनों के तहत बिल्कुल कॉम्पैक्ट है, लेकिन मैक्रो विस्तार के साथ लगभग 2500 लाइनें मिलती हैं]
__printf_fp
कार्यक्षमता का उपयोग करते हैं - यह अजीब है कि इसमें इतना लंबा समय लगता है stringstream
, जैसा कि वास्तव में नहीं होना चाहिए।
आप {fmt} लाइब्रेरीfmt::format
से फ़ंक्शन का उपयोग कर सकते हैं :
#include <fmt/core.h>
int main()
std::string s = fmt::format("{:.2f}", 3.14159265359); // s == "3.14"
}
कहाँ पे 2
सटीक है।
यह स्वरूपण सुविधा C ++: P0645 में मानकीकरण के लिए प्रस्तावित की गई है । P0645 और {fmt} दोनों एक पायथन-जैसे प्रारूप स्ट्रिंग सिंटैक्स का उपयोग करते हैं जो कि printf
's के समान है , लेकिन {}
इसके बजाय सीमांकक के रूप में उपयोग करता है %
।
यहाँ केवल एसटीडी का उपयोग कर एक समाधान। हालाँकि, ध्यान दें कि यह केवल गोल है।
float number = 3.14159;
std::string num_text = std::to_string(number);
std::string rounded = num_text.substr(0, num_text.find(".")+3);
इसके लिए rounded
पैदावार:
3.14
कोड पूरे फ़्लोट को स्ट्रिंग में कनवर्ट करता है, लेकिन "के बाद सभी वर्ण 2 वर्ण काटता है।"
number + 0.005
मेरे मामले में उदाहरण के लिए ।
यहां मैं एक नकारात्मक उदाहरण प्रदान कर रहा हूं जहां आपकी संख्या फ्लोटिंग संख्या को स्ट्रिंग्स में परिवर्तित करने से बचना चाहती है।
float num=99.463;
float tmp1=round(num*1000);
float tmp2=tmp1/1000;
cout << tmp1 << " " << tmp2 << " " << to_string(tmp2) << endl;
आपको मिला
99463 99.463 99.462997
नोट: संख्या चर 99.463 के करीब कोई भी मूल्य हो सकता है, आपको एक ही प्रिंट आउट मिलेगा। बिंदु सुविधाजनक c ++ 11 "to_string" फ़ंक्शन से बचने के लिए है। इस जाल से निकलने में मुझे थोड़ा समय लगा। सबसे अच्छा तरीका स्ट्रिंगस्ट्रीम और स्प्रिंटफ तरीके (सी भाषा) है। C ++ 11 या नए को फ्लोटिंग पॉइंट दिखाने के बाद अंकों की संख्या के रूप में एक दूसरा पैरामीटर प्रदान करना चाहिए। अभी डिफ़ॉल्ट 6 है। मैं इसे प्रस्तुत कर रहा हूं ताकि अन्य लोग इस विषय पर समय बर्बाद न करें।
मैंने अपना पहला संस्करण लिखा, कृपया मुझे बताएं कि क्या आपको कोई बग मिला है जिसे ठीक करने की आवश्यकता है। आप iomanipulator के साथ सटीक व्यवहार को नियंत्रित कर सकते हैं। मेरा कार्य दशमलव बिंदु के बाद अंकों की संख्या दिखाने के लिए है।
string ftos(float f, int nd) {
ostringstream ostr;
int tens = stoi("1" + string(nd, '0'));
ostr << round(f*tens)/tens;
return ostr.str();
}