2011-03-19 12 views
8

मेरे पास स्ट्रिंग में फ्लोट नंबर है। एक समस्या है संख्या "।" का उपयोग करती है नहीं "," दशमलव बिंदु के रूप में।पर्स स्ट्रिंग फ्लोट नंबर सी #

इस कोड काम नहीं कर रहा:

MyNumber = float.Parse("123.5"); 

मुझे पता है कि मैं पार्सिंग से पहले स्ट्रिंग का उपयोग कर सकते कार्य करने के लिए "मरम्मत" इस स्ट्रिंग की जगह।

MyNumber = float.Parse("123.5".Replace('.',','); 

लेकिन क्या ऐसा करने का कोई और तरीका है?

उत्तर

6

स्टीवन के प्रश्न को अलग-अलग तर्क देने के बजाय, महत्वपूर्ण बात क्यों दशमलव विभाजक . है।

यदि ऐसा इसलिए है क्योंकि स्रोत कंप्यूटर-पठनीय प्रारूप में है जहां अवधि दशमलव विभाजक को दस्तावेज़ विनिर्देश के हिस्से के रूप में निर्दिष्ट किया गया है, तो मैं ठीक उसी तरह जाऊंगा क्योंकि स्टीवन CultureInfo.InvariantCulture का उपयोग करने में करता है।

यदि यह किसी विशेष लोकेल में मानव इनपुट है, तो आप उस लोकेल के लिए CultureInfo द्वारा उस लोकेल से मेल खाना चाहते हैं, अन्यथा यदि सॉफ़्टवेयर का उपयोग एक अलग लोकेल के साथ किया जाता है तो आपको बिल्कुल विपरीत समस्या होगी। आम तौर पर आप इस (CurrentCulture प्रारूपों के लिए CurrentUICulture) के लिए मिलान करने के लिए थ्रेड के CurrentCulture सेट करना चाहते हैं। यदि आपने ऐसा किया है, तो आपको संस्कृति को पारित करने की आवश्यकता नहीं है, क्योंकि float.Parse(string) उस संस्कृति का उपयोग करता है - हालांकि, आप यह स्पष्ट करने के लिए float.Parse(string, CurrentCulture) का उपयोग करना चाहेंगे कि यह वही है जो आप कर रहे हैं (और बंद करने के लिए कुछ सॉफ्टवेयर विश्लेषण जो शिकायत करते हैं जब आप इस तरह से विशिष्ट नहीं हैं)।

क्या वास्तव में मुश्किल हो जाता है, यदि आपको संभावित रूप से दोनों अवधि और अल्पविराम को स्वीकार करना है - कम से कम नहीं, क्योंकि कई संस्कृतियां जो दशमलव विभाजक के रूप में अवधि का उपयोग करती हैं, अल्पविराम के रूप में अल्पविराम का उपयोग करते हैं, और आखिरकार असीमित पार्सिंग की गारंटी देना असंभव है। हालांकि, मानते हुए कि हजारों मुद्दे आपको प्रभावित नहीं करते हैं, तो आपके प्रश्न में जो कोड दिया गया वह दृष्टिकोण है, हालांकि मैं विपरीत करने की सिफारिश करता हूं (अवधि के साथ अल्पविराम को प्रतिस्थापित करता हूं) और फिर इनवेरिएंट संस्कृति के साथ विश्लेषण करता हूं, क्योंकि इससे कोई भी हटा देता है और अधिक जटिलताओं के कारण और अधिक जटिलताओं के कारण।

20

स्ट्रिंग प्रतिस्थापन का उपयोग करना बहुत नाजुक है, और सूक्ष्म बग का कारण बन जाएगा। इसके बजाय IFormatProvider निर्दिष्ट करें। उदाहरण के लिए:

MyNumber = float.Parse("123.5", CultureInfo.InvariantCulture); 

या आप Parse का एक और अधिभार का उपयोग कर NumberFormatInfo निर्दिष्ट कर सकते हैं।

+2

क्यों 'nl-NL' और नहीं' CultureInfo.InvariantCulture'? –

+2

@ जोनास: 'एनएल-एनएल' सिर्फ एक उदाहरण था, लेकिन सवाल को बारीकी से पढ़ने के बाद, मैंने देखा कि ओपी के 'CultureInfo.CurrentCulture'' को दशमलव विभाजक के रूप में '' 'है। डच संस्कृति (nl) वास्तव में दशमलव विभाजक के रूप में ',' का उपयोग करती है, और इसलिए * काम नहीं करेगा। तो यह चाल वास्तव में ऐसी संस्कृति स्थापित करने के लिए है जो '.' को दशमलव विभाजक के रूप में उपयोग करती है जैसे 'एन-यूएस' और इनवेरिएंट संस्कृति। इस बात की जानकारी देने के लिए धन्यवाद। – Steven

1

यह वर्तमान में निष्पादित थ्रेड संस्कृति की वर्तमान संस्कृति पर निर्भर करता है।

float.Parse("123,5", system.threading.thread.currentthread.currentculture); 

float.Parse("123.5", system.threading.thread.currentthread.currentculture); 

आप सख्ती से culturespecific तो नहीं करना चाहते हैं

float.Parse("123.5", CultureInfo.InvariantCulture); 
संबंधित मुद्दे