2012-09-07 9 views
6

में दशमलव अंकों की संख्या बढ़ाने के लिए std :: stod() tweak करने का कोई तरीका है (स्ट्रिंग टू डबल) रूपांतरण और यूएस लोकेल का उपयोग करने के लिए मजबूर करने के लिए? मैं डबल विधि के लिए एक स्ट्रिंग है कि नई सी ++ 11 Stod लपेटता हैदशमलव विभाजक के लिए std :: stod (double to string) को tweak कैसे करें और

if (opt->getFlag('c') || opt->getFlag("console")){ 
    ThreadManager modelMainThread; 
    modelMainThread.runFromConsole(inputFileName,scenarioName); 
} 
else { 
    QApplication app(argc, argv); 
    MainWindow mainWin; 
    mainWin.show(); 
    return app.exec(); 
} 

इस आवेदन के भीतर::

मैं एक क्यूटी आवेदन है कि दोनों कंसोल या GUI मोड में चलाया जा सकता है है

double s2d (const string &string_h) const { 
    try { 
    return stod(string_h); 
    } catch (...) { 
    if (string_h == "") return 0; 
    else { 
     cout << "error!" << endl; 
    } 
    } 
    return 0; 
} 

कंसोल मोड में स्ट्रिंग मोड में स्ट्रिंग को दशमलव विभाजक के रूप में डॉट के साथ स्ट्रिंग की अपेक्षा करता है, गुई मोड में, इसके बजाय कॉमा के साथ एक स्ट्रिंग की अपेक्षा करता है। इसके अलावा, जैसा कि मैंने पहले से istringstream उपयोग कर रहा था:

istringstream totalSString(valueAsString); 
totalSString >> valueAsDouble; 

मैंने देखा है कि Stod सिर्फ 3 दशमलव अंक, istringstream से काफी कम करने के लिए डबल जिसके परिणामस्वरूप ट्रंकेटस।

तो क्या दशमलव अंकों की संख्या बढ़ाने और रूपांतरण के लिए यूएस लोकेल का उपयोग करने के लिए std :: stod को मजबूर करने का कोई तरीका है? :-)

धन्यवाद

संपादित:

अगर मैं इस स्क्रिप्ट का प्रयास करें:

// testing stod() .. 
vector<string> numbers; 
numbers.push_back("123.1234567890"); 
numbers.push_back("123.1234"); 
numbers.push_back("123,1234567890"); 
numbers.push_back("123,1234"); 
double outd; 
for(uint i=0;i<numbers.size();i++){ 
    try { 
     outd = stod(numbers[i]); 
     cout << "Conversion passed: " << numbers[i] << " - " << outd << endl; 
    } catch (...) { 
     cout << "Conversion DID NOT passed: " << numbers[i] << " - " <<endl; 
    } 
} 

मुझे मिल इन परिणामों:

"कंसोल" मोड:

Conversion passed: 123.1234567890 - 123.123 
Conversion passed: 123.1234 - 123.123 
Conversion passed: 123,1234567890 - 123 
Conversion passed: 123,1234 - 123 

"जीयूआई" मोड:

Conversion passed: 123.1234567890 - 123 
Conversion passed: 123.1234 - 123 
Conversion passed: 123,1234567890 - 123.123 
Conversion passed: 123,1234 - 123.123 

तो स्पष्ट रूप से नहीं है कुछ को प्रभावित करने Stod() व्यवहार!

+1

'stod' को'% f' के साथ 'sprintf' का उपयोग करने के रूप में परिभाषित किया गया है। यह विन्यास योग्य नहीं है। –

+0

यदि आप कच्चे रनटाइम की गति से चिंतित हैं और लोकेल आजादी चाहते हैं, और संभावित रूप से खराब संकलन समय के बारे में चिंतित नहीं हैं, [बूस्ट। पाइरिट] (http://www.boost.org/libs/spirit/) .Qi है बिल्कुल जाने का रास्ता। – ildjarn

+0

इस पर ठोकर खाई और चौंक गया कि स्टोड मूल्यों को कम कर देता है। लेकिन समस्या यह है कि std :: cout पूरे मान को आउटपुट नहीं करता है। आपको उच्च परिशुद्धता सेट करनी है: std :: cout << std :: setprecision (16); – ead

उत्तर

7

std::stod और उसके परिजन एक अंकीय प्रकार के लिए एक स्ट्रिंग से एक सरल, त्वरित रूपांतरण प्रदान करने के लिए डिजाइन किए गए थे। (पूर्ण प्रकटीकरण: यह मेरा डिजाइन है) तो, नहीं, कोई स्थान नहीं; जो दिखता है वही मिलता है।

+0

तो, जिज्ञासा के लिए, मेरे पास गुई/कंसोल मोड में यह अलग व्यवहार क्यों है? वहां कुछ ऐसा होना चाहिए जो क्यूटी पुस्तकालयों ने सेट किया है जो स्टोड व्यवहार को प्रभावित करते हैं। – Antonello

+0

@ एंटोनेलो - क्षमा करें, मुझे क्यूटी के साथ कोई अनुभव नहीं है। –

+2

सिर्फ स्पष्टीकरण के लिए, स्टोड() कम से कम जीसीसी में वर्तमान लोकेल से प्रभावित है। तो उदाहरण के लिए यह सुनिश्चित करने के लिए कि यह डॉट का उपयोग दशमलव विभाजक के रूप में करेगा, किसी को #और सेटलोकेल (एलसी_ALL, "सी") का उपयोग करना चाहिए (यह डिफ़ॉल्ट है, लेकिन स्पष्ट रूप से क्यूटी को इसे चलने वाले कंप्यूटर लोकेल में सेट करना होगा ताकि आपको ओवरराइड करना होगा क्यूटी ओवरराइड ;-)) – Antonello

1

std::stodstd::string को दो बार परिवर्तित करने का एक सामान्य तरीका है। यदि आप कुछ और विशिष्ट चाहते हैं, तो आपको इसे स्वयं लागू करना चाहिए।

उदाहरण के लिए:

double my_stod(const std::string &valueAsString) { 
    istringstream totalSString(valueAsString); 
    double valueAsDouble; 
    // maybe use some manipulators 
    totalSString >> valueAsDouble; 
    if(!totalSString) 
     throw std::runtime_error("Error converting to double");  
    return valueAsDouble; 
} 
+0

हाँ यह वही है जो मैं वास्तव में उपयोग कर रहा था, लेकिन यह बहुत धीमी है, और मैं गति से काफी चिंतित हूं .. – Antonello

+0

अच्छा, सवाल "std :: stod teak कैसे करें" था। जवाब दुख की बात है "आप नहीं कर सकते"।यदि आपको वास्तव में पता चलता है कि स्ट्रिंगस्ट्रीम का उपयोग करके आपके कोड में एक बाधा है, तो आपको इसे अनुकूलित करना चाहिए। लेकिन याद रखें, समय से पहले अनुकूलित न करें। – mfontanini

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