2014-04-25 4 views
17

स्ट्रिंग मान "90-" है। दशमलव को "-90" के रूप में पार्स क्यों करें लेकिन doubleFormatException फेंकता है?दशमलव पार्स अंक

var inputValue= "90-"; 
Console.WriteLine(decimal.Parse(inputValue)); 
Console.WriteLine(double.Parse(inputValue)); 
+2

क्या आपके पास अपने कोड नमूने में '.TryParse' होना है? – krillgar

+4

'एरिक लिपर्ट' –

+0

के लिए अच्छा सवाल वे संख्या पार्सर पर अलग-अलग डिफ़ॉल्ट पास करते हैं। 'दशमलव' एक सामान्य धन स्वरूपों को देखने के लिए कॉन्फ़िगर किया गया है और 'डबल' एक नहीं है। – Gabe

उत्तर

15

decimal.Parse(string s) अधिभार, डिफ़ॉल्ट रूप से, NumberStyleNumberStyles.Number साथ कहा जाता है के रूप में परिभाषित किया गया है:

इंगित करता है कि AllowLeadingWhite, AllowTrailingWhite, AllowLeadingSign, AllowTrailingSign, AllowDecimalPoint, और AllowThousands शैलियों उपयोग किया जाता है। यह एक समग्र संख्या शैली है।

ध्यान दें कि AllowTrailingSign शामिल है। यदि आप व्यवहार को कस्टमाइज़ करना चाहते हैं तो आपको स्पष्ट रूप से अधिभार को कॉल करना चाहिए जो आपको एक संख्या शैली निर्दिष्ट करने और आपकी आवश्यकताओं के अनुरूप बनाने की अनुमति देता है।

4

दिलचस्प, ऐसा लगता है कि डिफ़ॉल्ट रूप से, decimal और double अलग संख्या शैलियों का उपयोग:

http://msdn.microsoft.com/en-us/library/cafs243z.aspx

पैरामीटर रों NumberStyles.Number शैली का उपयोग व्याख्या की है। इसका मतलब है कि सफेद जगह और हजारों विभाजकों की अनुमति है लेकिन मुद्रा प्रतीक नहीं हैं।

http://msdn.microsoft.com/en-us/library/fd84bdyt(v=vs.110).aspx

एस पैरामीटर NumberStyles.Float और NumberStyles.AllowThousands झंडे के संयोजन का उपयोग व्याख्या की है। इसका मतलब है कि सफेद स्थान और हजारों विभाजकों की अनुमति है, उदाहरण के लिए, जबकि मुद्रा प्रतीकों नहीं हैं।

यह तुरंत उन विवरण से स्पष्ट नहीं है, लेकिन अगर आप इसे देखो, NumberStyles.Number संकेत अनुगामी की अनुमति देता है:

http://msdn.microsoft.com/en-us/library/system.globalization.numberstyles.aspx

इंगित करता है कि AllowLeadingWhite, AllowTrailingWhite, AllowLeadingSign, AllowTrailingSign, AllowDecimalPoint, और Allowhhousands शैलियों का उपयोग किया जाता है। यह एक समग्र संख्या शैली है।

संभावित रूप से डिफ़ॉल्ट में अंतर है क्योंकि decimal अक्सर मुद्रा गणनाओं के लिए उपयोग किया जाता है।

बेशक, दोनों मामलों में आप अपना खुद का नंबर प्रारूप प्रदान कर सकते हैं जो आप वास्तव में निर्दिष्ट करते हैं और स्वीकार नहीं करना चाहते हैं ताकि आप उन्हें अपने उपयोग के लिए सुसंगत बना सकें।

8

कार्यान्वयन दोनों के बीच अलग है:

public static double Parse(String s) { 
    return Parse(s, NumberStyles.Float| NumberStyles.AllowThousands, NumberFormatInfo.CurrentInfo); 
} 

public static Decimal Parse(String s) { 
    return Number.ParseDecimal(s, NumberStyles.Number, NumberFormatInfo.CurrentInfo); 
} 

जहां

NumberStyles.Float  = AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign | 
         AllowDecimalPoint | AllowExponent, 

NumberStyles.Number = AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign | AllowTrailingSign | 
         AllowDecimalPoint | AllowThousands 

तो decimal.Parse संकेत अनुगामी की अनुमति देता है, लेकिन double.Parse नहीं करता है।

MSDN पर documentation ऐसा लगता है कि गलत है:

[ws] [संकेत] [अंक,] अंक [.fractional अंक] [:

पैरामीटर रों प्रपत्र की एक संख्या में शामिल ws]

यह इंगित करना चाहिए कि एक अनुगामी संकेत के रूप में अच्छी तरह से वैध है।

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