2010-04-27 8 views
11

हम एक स्थापित सॉफ्टवेयर विकसित करते हैं जो एक को छोड़कर सभी ज्ञात कंप्यूटरों पर ठीक काम करता है। समस्या "8" से शुरू होने वाली तारों को पार्स करना है। ऐसा लगता है कि एक स्ट्रिंग की शुरुआत में "8" एक आरक्षित चरित्र है।int। "8" का पार्स विफल रहता है। Int.Parse हमेशा CultureInfo.InvariantCulture की आवश्यकता है?

Parsing: 
int.Parse("8") -> Exception message: Input string was not in a correct format. 
int.Parse("80") -> 0 
int.Parse("88") -> 8 
int.Parse("8100") -> 100 

CurrentCulture: sv-SE 
CurrentUICulture: en-US 

समस्या int.Parse ("8", CultureInfo.InvariantCulture) का उपयोग कर हल किया जाता है। हालांकि, समस्या के स्रोत को जानना अच्छा लगेगा।

प्रश्न: अगर हम इनवेंचर संस्कृति निर्दिष्ट नहीं करते हैं तो हमें "8" का यह व्यवहार क्यों मिलता है?


अतिरिक्त जानकारी:

मैं अपने ग्राहक के लिए एक छोटा सा कार्यक्रम भेजने किया ऊपर परिणाम प्राप्त:

private int ParseInt(string s) 
    { 
     int parsedInt = -1000; 
     try 
     { 
      parsedInt = int.Parse(s); 

      textBoxMessage.Text = "Success: " + parsedInt; 

     } 
     catch (Exception ex) 
     { 
      textBoxMessage.Text = 
       string.Format("Error parsing string: '{0}'", s) + Environment.NewLine + 
       "Exception message: " + ex.Message; 
     } 

     textBoxMessage.Text += Environment.NewLine + Environment.NewLine + 
      "CurrentCulture: " + Thread.CurrentThread.CurrentCulture.Name + "\r\n" + 
      "CurrentUICulture: " + Thread.CurrentThread.CurrentUICulture.Name + "\r\n"; 
     return parsedInt; 
    } 

अद्यतन

मैं भर में ठोकर खाई इस लिंक, माइक्रोसॉफ्ट कनेक्ट डेटाबेस में एक बग:

https://connect.microsoft.com/VisualStudio/feedback/details/253265/int32-parse-fails-to-convert-the-string-0-zero-on-some-systems

ऐसा लगता है समान लक्षणों के साथ एक मुद्दा है, लेकिन कोई वास्तविक मूल कारण वहाँ की तरह। अगर कोई इस पर विस्तार कर सकता है तो मैं आभारी रहूंगा!

उत्तर

21

sv-SE संस्कृति 8CurrencyNegativePattern का प्रतिनिधित्व करता है और यही कारण है कि आपको त्रुटि का वर्णन हो रहा है।

आप निम्न उदाहरण चलाकर इस जाँच कर सकते हैं:

var ci = new CultureInfo("sv-SE"); 

var nfi = (NumberFormatInfo)ci.GetFormat(typeof(NumberFormatInfo)); 

Console.WriteLine(nfi.CurrencyNegativePattern); 
Console.WriteLine(nfi.CurrencyPositivePattern); 

हो जाएगा ताकि उत्पादन:

आप स्पष्ट रूप से कह सकते हैं कि आप Parse का उपयोग करके एक पूर्णांक और नहीं एक मुद्रा को पार्स कर रहे हैं अधिभार जो NumberStyles गणना स्वीकार करता है।

Int32.Parse("8", NumberStyles.Integer, new CultureInfo("sv-SE")); 

इस बार जब आप यह निर्दिष्ट कर रहे हैं कि आप एक पूर्णांक पार्स कर रहे हैं तो कोई त्रुटि नहीं होगी।


हालांकि, IIRC Int32.Parse डिफ़ॉल्ट रूप से एक पूर्णांक के रूप में इनपुट की व्याख्या करना चाहिए, ताकि तुम क्यों कि नमूना कोड के साथ त्रुटि के हो रही है मुझे परे है।


अद्यतन:

जानकारी आप हाल ही में जोड़ा ऐसा लगता है कि आप यह सुनिश्चित करें कि समस्या बाहरी नहीं है बनाना चाहिए से।यह है, यदि उदाहरण के लिए उपयोगकर्ता ने विंडोज लोकेल की सकारात्मक साइन सेटिंग 8 में बदल दी है तो यह सामान्य होगा और आपको प्राप्त होने वाली त्रुटि प्राप्त करने के लिए सही अर्थ होगा। यह सिर्फ सकारात्मक संकेत के रूप में + स्थापित करने और फिर इसे पार्स करने का प्रयास की तरह होगा:

var ci = new CultureInfo("sv-SE"); 
var nfi = (NumberFormatInfo)ci.GetFormat(typeof(NumberFormatInfo)); 

nfi.PositiveSign = "+"; 

Int32.Parse("+", nfi); // This will throw 

उपयोगकर्ता पूछो यह स्थान रजिस्ट्री सेटिंग्स कनेक्ट मुद्दे में संकेत की तरह है के लिए और जांच वे तुम्हें क्या उम्मीद करेंगे रहे हैं।

साइड नोट: एसओ में आपका स्वागत है और अगली बार जब आपको अपने प्रश्न में और जानकारी जोड़ने की आवश्यकता है तो आपको इसे उत्तर में देने के बजाय इसे संपादित करना चाहिए।

+0

साइड नोट के लिए धन्यवाद, मैंने इसका ख्याल रखा :) मैंने अपनी लोकेल सेटिंग्स के लिए रजिस्ट्री में मूल्यों की पहले जांच की है और केवल 8 बाहर मुद्रा नकारात्मक पैटर्न है जो त्रुटि को पुन: उत्पन्न करने में मेरी सहायता नहीं करता है मेरी मशीन पर आप निश्चित रूप से जियोओ के सही रास्ते पर हैं। हालांकि, यह मुद्दा एक कठिन है और मुझे यकीन नहीं है कि माइक्रोसॉफ्ट इस मुद्दे के कारण को भी जानता है। आप निश्चित रूप से एक बड़ा यूपी प्राप्त कर रहे हैं, लेकिन व्यवहार अभी भी एक रहस्य है। यही कारण है कि मैं स्वीकार नहीं कर रहा हूं कि आप समाधान के रूप में जवाब दे रहे हैं भले ही मैं आपके प्रयास के लिए आभारी हूं! –

+3

इस उत्तर की शुरुआत मेरे लिए गलत लगता है। 'NumberFormatInfo.CurrencyNegativePattern' और' NumberFormatInfo.CurrencyPositivePattern' में मान केवल कुंजी के रूप में उपयोग किए जाते हैं - ऋणात्मक चिह्न (-), मुद्रा चिह्न, और संख्या स्वयं को प्रारूपण/पार्सिंग के लिए उपयोग करने के क्रम की पहचान करने के लिए। उदाहरण के लिए, '8' 'मुद्रा परिवर्तक पैटर्न' के मूल्य के रूप में इसका अर्थ है कि पैटर्न '-n $' होना चाहिए। –

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