2017-10-13 10 views
25

मैं एक विशिष्ट प्रारूप (एक हजारों विभाजक के रूप में apostrophes का उपयोग कर) के साथ एक स्ट्रिंग के लिए एक डबल प्रारूपित करने के लिए std :: ostringstream का उपयोग कर रहा हूँ। हालांकि, कुछ मामलों में ostringstream ने मुझे जो अपेक्षा की थी उससे अलग परिणाम दिया।std :: ostringstream गलत स्थान पर साइन इन करता है?

जहां तक ​​मैं कह सकता हूं, नीचे दिए गए कोड का अपेक्षित आउटपुट "+01" होना चाहिए; इसके बजाय यह "0 + 1" आउटपुट करता है। मैं यहां क्या गलत कर रहा हूं, और मुझे परिणाम की आवश्यकता कैसे मिल सकती है?

#include <iomanip> 
#include <iostream> 
#include <sstream> 

int main() 
{ 
    std::ostringstream stream; 
    stream << std::showpos; // Always show sign 
    stream << std::setw(3); // Minimum 3 characters 
    stream << std::setfill('0'); // Zero-padded 
    stream << 1; // Expected output: "+01" 

    std::cout << stream.str(); // Output: "0+1" 
    return 0; 
} 

Code on ideone

उत्तर

36

गद्दी, left, right, and internal के लिए तीन विकल्प हैं।

आप internal पैडिंग, संकेत और मूल्य के बीच चाहते हैं।

stream << std::setfill('0') << std::internal; // Zero-padded 
0

यही है, दुर्भाग्य से, यह कैसे काम माना जाता है। '0' को वर्ण के रूप में उपयोग किया जाता है, संख्या के हिस्से के रूप में नहीं।

इसे ठीक करने के लिए, आप उत्पादन करना चाहिए + या - अलग:

std::ostringstream oss; 
oss << "+-"[x<0]; 
oss << std::setw(2) << std::setfill('0') << std::abs(x); 
return/cout/whatever oss.str(); 
+0

केवल कुछ और पात्रों के साथ, 'ओएसएस << (x> = 0? : '+': '-'); 'मेरी राय में, और अधिक पठनीय होगा। – YSC

+1

पीओ चाहता है कि यह प्राप्त करना संभव है। बस @ पेट बेकर का जवाब या मेरा देखो। – informaticienzero

11

आप (जैसा दिखाया है here) std::showpos से पहले std::internal जस्ट उपयोग कर सकते हैं।

हमें "आंतरिक पैडिंग" डालने के लिए स्ट्रीम को बताने के लिए std :: आंतरिक ध्वज जोड़ने की आवश्यकता है - यानी, पैडिंग को चिन्ह और शेष संख्या के बीच डाला जाना चाहिए।

#include <iomanip> 
#include <iostream> 
#include <sstream> 

int main() 
{ 
    std::ostringstream stream; 

    stream << std::setfill('0'); 
    stream << std::setw(3); 
    stream << std::internal; 
    stream << std::showpos; 
    stream << 1; 

    std::cout << stream.str(); // Output: "+01" 
    return 0; 
} 
8

भरने चरित्र किसी भी प्रकार के साथ प्रयोग किया जाता है एक दिया चौड़ाई भरने के लिए। डिफ़ॉल्ट रूप से भरने वाले वर्ण मान के बाईं ओर जाते हैं, और यही वह है जो आप उन शून्यों के साथ देख रहे हैं।

std::cout << std::internal << std::setfill(0) << std::setw(3) << 1 << '\n'; 

तुम भी std::left या std::right मूल्य या सही के बाईं पर भरने के पात्रों डाल करने के लिए उपयोग कर सकते हैं: समाधान है कि डिफ़ॉल्ट ओवरराइड और धारा बता भरने पात्रों के अंदर का पाठ डाल करने के लिए है मूल्य का

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