2012-01-16 10 views
7

मैं जानना चाहता हूं कि मुझे कुछ याद आ रहा है या नहीं ... मैं मानक ग्रेट ब्रिटिश संस्कृति के तहत चल रहा हूं।Double.TryParse() NumberFormatInfo.NumberGroupSizes को अनदेखा करता है?

Double result = 0; 
if (Double.TryParse("1,2,3", NumberStyles.Any, CultureInfo.CurrentCulture, out result)) 
{ 
    Console.WriteLine(result); 
} 

अपेक्षित आउटपुट कुछ भी नहीं होगा ... "1,2,3" को डबल के रूप में पार्स नहीं करना चाहिए। हालांकि यह करता है। नेट 2,0 MSDN documentation

AllowThousands के अनुसार यह बताता है सांख्यिक स्ट्रिंग समूह विभाजक हो सकता है; उदाहरण के लिए, सैकड़ों को हजारों से अलग करना। मान्य समूह विभाजक वर्ण NumberFormatInfo की NumberGroupSeparator और CurrencyGroupSeparator गुण और प्रत्येक समूह में अंक NumberFormatInfo की NumberGroupSizes और CurrencyGroupSizes गुण से निर्धारित होता है की संख्या से निर्धारित होते हैं।

हजारों को नंबर स्टाइल में शामिल करने की अनुमति दें। कोई भी। नंबर संस्कृति समूह मेरी संस्कृति के लिए 3 है। क्या यह डबल में एक बग है। पर्स? असंभव लगता है लेकिन मैं यह नहीं देख सकता कि मैं क्या गलत कर रहा हूं ....

+0

यह हो सकता है जब परीक्षण कारण है कि मैं एक वैध परिणाम मिला [मेरा उत्तर] (http://stackoverflow.com/questions/1014535/float-parse-doesnt-work-the -वे-आई-वांछित/1014559 # 1014559) इसी तरह के प्रश्न पर। – ChrisF

+0

बस उत्सुक है, लेकिन परिणाम का मूल्य क्या है? – Aaron

+0

मुझे लगता है कि आपको माइक्रोसॉफ्ट से पूछना होगा कि क्या यह एक बग है, लेकिन मुझे आपके जैसा ही व्यवहार मिलता है। हमेशा 'नंबर स्टाइल' कर सकते हैं। कोई भी^संख्या स्टाइल। AllowThousands' लेकिन यदि आप तीनों के वैध समूह की अपेक्षा कर रहे हैं तो इसका अधिक उपयोग नहीं है। – Jodrell

उत्तर

5

इसका मतलब है कि इनपुट स्ट्रिंग में NumberFormatInfo.NumberGroupSeparator के शून्य या अधिक उदाहरण हो सकते हैं। इस विभाजक का उपयोग किसी भी आकार की संख्याओं के समूहों को अलग करने के लिए किया जा सकता है; सिर्फ हजारों ही नहीं। NumberFormatInfo.NumberGroupSeparator और NumberFormatInfo.NumberGroupSizes का उपयोग तारों के रूप में दशमलव स्वरूपित करते समय किया जाता है। परावर्तक का उपयोग करना ऐसा लगता है जैसे NumberGroupSeparator केवल यह निर्धारित करने के लिए प्रयोग किया जाता है कि चरित्र एक विभाजक है, और यदि ऐसा है, तो इसे छोड़ दिया जाता है। NumberGroupSizes बिल्कुल उपयोग नहीं किया जाता है।

यदि आप स्ट्रिंग को सत्यापित करना चाहते हैं, तो आप RegEx का उपयोग करके ऐसा कर सकते हैं या ऐसा करने के लिए एक विधि लिख सकते हैं। यहाँ एक है मैं सिर्फ एक साथ काट दिया:

string number = "102,000,000.80"; 
var parts = number.Split(','); 
for (int i = 0; i < parts.Length; i++) 
{ 
    var len = parts[i].Length; 
    if ((len != 3) && (i == parts.Length - 1) && (parts[i].IndexOf('.') != 3)) 
    { 
     Console.WriteLine("error"); 
    } 
    else 
    { 
     Console.WriteLine(parts[i]); 
    } 
} 

// Respecting Culture 
static Boolean CheckThousands(String value) 
{ 
    String[] parts = value.Split(new string[] { CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator }, StringSplitOptions.None); 
    foreach (String part in parts) 
    { 
     int length = part.Length; 
     if (CultureInfo.CurrentCulture.NumberFormat.NumberGroupSizes.Contains(length) == false) 
     { 
      return false; 
     } 
    } 

    return true; 
} 
+0

+1, ऐसा लगता है कि 'संख्या समूह समूह' को पार्सिंग पर अनदेखा किया जाता है (आंतरिक विधि 'संख्या। पर्सनंबर' है)। – user7116

+0

मैं अभी परावर्तक के साथ खुदाई करना शुरू कर दूंगा लेकिन अभी तक उतना दूर पाने का समय नहीं था। मैं वास्तव में रेगेक्स का उपयोग करने पर विचार कर रहा हूं, लेकिन मुझे सावधान रहना होगा और यह सुनिश्चित करना होगा कि यह अभी भी सभी संस्कृति जागरूक है। – Ian

+0

@Ian आप प्रत्येक संस्कृति के लिए NumberFormatInfo में संग्रहीत जानकारी के आधार पर अपने रेगेक्स एक्सप्रेशन बना सकते हैं। –

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