2009-06-18 13 views
10

मेरे पास एक टेक्स्ट फ़ाइल है, जिसका उपयोग मैं अपने आवेदन में जानकारी इनपुट करने के लिए करता हूं। समस्या यह है कि कुछ मूल्य फ़्लोट होते हैं और कभी-कभी वे शून्य होते हैं, यही कारण है कि मैं अपवाद प्राप्त करें।float.Parse() जिस तरह से मैं चाहता था

 var s = "0.0"; 
     var f = float.Parse(s); 

उपरोक्त कोड पंक्ति 2 पर अपवाद फेंकता है "इनपुट स्ट्रिंग सही प्रारूप में नहीं थी।"

मेरा मानना ​​है कि समाधान फ्लोट के उन्नत अधिभार होगा। पर्स, जिसमें पैरामीटर के रूप में IFormatProvider शामिल है, लेकिन मुझे अभी तक इसके बारे में कुछ भी पता नहीं है।

मैं "0.0" का विश्लेषण कैसे करूं?

+0

मैंने आपके कोड को आजमाया है और मूल्य जुर्माना पार्स करने में सक्षम हूं। –

+3

यह कोड संस्कृति निर्भर है (यानी लोकेल निर्भर)। तो हम में से कुछ इस व्यवहार को नहीं देख पाएंगे। – inazaruk

उत्तर

22

डॉट प्रतीक "।" विभाजक के रूप में प्रयोग नहीं किया जाता है (यह संस्कृति सेटिंग्स पर निर्भर करता है)। तो अगर आप पूरी तरह से सुनिश्चित करने के लिए कि डॉट ठीक प्रकार से पार्स है चाहता हूँ आप कुछ इस तरह लिखने की ज़रूरत:

CultureInfo ci = (CultureInfo)CultureInfo.CurrentCulture.Clone(); 
ci.NumberFormat.CurrencyDecimalSeparator = "."; 
avarage = double.Parse("0.0",NumberStyles.Any,ci); 
+0

मुझे देर से उत्तर देने के लिए बहुत खेद है (मैंने अब आपका जवाब स्वीकार कर लिया है), लेकिन मैं व्यस्त हूं। आपके उत्तर के लिए धन्यवाद, यह वही करता है जो मुझे चाहिए। मैं वास्तव में इसकी सराहना करता हूं। –

+2

CultureInfo.InvariantCulture बेहतर है। (निचे देखो) –

2

मैंने अभी कोशिश की है और यह किसी भी अपवाद को फेंक नहीं दिया है।

क्या दशमलव संख्या के बजाय दशमलव अल्पविराम का उपयोग कर अपना नंबर प्रारूप है? आप की कोशिश की है:

var s = "0,0"; 
var f = float.Parse(s); 

इस मैं सिर्फ अल्पविराम एक अपवाद प्राप्त करने की उम्मीद कर के साथ यह कोशिश की है से पूछा है, लेकिन ऐसा नहीं किया। तो यह जवाब नहीं हो सकता है।

+0

अपवाद सही लोकेल के साथ बनाया जा सकता है, उदाहरण के लिए अंग्रेजी। – Akku

+0

@ अक्कु - मुझे सही परीक्षण याद नहीं आया है (मैंने यह जवाब 2 1/2 साल पहले पोस्ट किया था), लेकिन मुझे स्थानीय लोगों के बारे में पता है और वे संख्याओं के विश्लेषण को कैसे प्रभावित करते हैं। मैं उपयोगकर्ता को सुझाव दे रहा था कि * उसका * लोकेल उस बिंदु पर सेट किया गया था जो दशमलव बिंदुओं की बजाय दशमलव कॉमा की अपेक्षा करता था। – ChrisF

+0

यह [नया प्रश्न] (http://stackoverflow.com/questions/8883801/double-tryparse-ignores-numberformatinfo-numbergroupsizes) समझा सकता है कि मुझे अपवाद के बजाय परिणाम क्यों मिला। – ChrisF

2

या, आप आसानी से जांच सकते हैं कि इनपुट टेक्स्ट शून्य या खाली नहीं है या नहीं।

इसके अलावा, सावधान रहें, क्योंकि कुछ देशों में, "।" (डॉट) जो फ्लोट नंबर को अलग करता है "," (अल्पविराम)

+0

असल में, यह एक बिंदु है और यह काम नहीं करता है। जब मैंने इसे अल्पविराम में बदल दिया, तो यह काम किया। मुझे पूरी फाइल बदलनी पड़ सकती है। –

+1

नहीं, आप नहीं करते हैं। आप कस्टम विभाजक के रूप में पहचाने जाने के लिए डॉट सेट कर सकते हैं। – inazaruk

+0

दिलचस्प, लेकिन कैसे? –

6

आप पहली बार शून्य या खाली स्ट्रिंग के लिए देख सकते हैं।

आप अधिक विशिष्ट नियंत्रण देने के लिए Parse (या यहां तक ​​कि TryParse का उपयोग करें) के अधिभारों में से एक का भी उपयोग कर सकते हैं।

उदा। invarient संस्कृति का उपयोग कर, गैर उपयोगकर्ता दिखाई डेटा के साथ दशमलव विभाजक विविधताओं से बचने के लिए जाँच करने के लिए (जैसे A2A संचार से): मेरे लिए

float SafeParse(string input) { 
    if (String.IsNullOrEmpty(input)) { throw new ArgumentNullException("input"); } 

    float res; 
    if (Single.TryParse(input, NumberStyles.Float, CultureInfo.InvariantCulture, out res)) { 
    return res; 
    } 

    return 0.0f; // Or perhaps throw your own exception type 
} 
3

के बाद काम करता है:

string stringVal = "0.0"; 
float floatVal = float.Parse(stringVal , CultureInfo.InvariantCulture.NumberFormat); 

रिवर्स मामले (के लिए काम करता सभी coutries):

float floatVal = 0.0f; 
string stringVal = floatVal.ToString("F1", new CultureInfo("en-US").NumberFormat); 
संबंधित मुद्दे