स्ट्रिंग मान "90-"
है। दशमलव को "-90"
के रूप में पार्स क्यों करें लेकिन double
FormatException
फेंकता है?दशमलव पार्स अंक
var inputValue= "90-";
Console.WriteLine(decimal.Parse(inputValue));
Console.WriteLine(double.Parse(inputValue));
स्ट्रिंग मान "90-"
है। दशमलव को "-90"
के रूप में पार्स क्यों करें लेकिन double
FormatException
फेंकता है?दशमलव पार्स अंक
var inputValue= "90-";
Console.WriteLine(decimal.Parse(inputValue));
Console.WriteLine(double.Parse(inputValue));
decimal.Parse(string s)
अधिभार, डिफ़ॉल्ट रूप से, NumberStyleNumberStyles.Number
साथ कहा जाता है के रूप में परिभाषित किया गया है:
इंगित करता है कि AllowLeadingWhite, AllowTrailingWhite, AllowLeadingSign, AllowTrailingSign, AllowDecimalPoint, और AllowThousands शैलियों उपयोग किया जाता है। यह एक समग्र संख्या शैली है।
ध्यान दें कि AllowTrailingSign
शामिल है। यदि आप व्यवहार को कस्टमाइज़ करना चाहते हैं तो आपको स्पष्ट रूप से अधिभार को कॉल करना चाहिए जो आपको एक संख्या शैली निर्दिष्ट करने और आपकी आवश्यकताओं के अनुरूप बनाने की अनुमति देता है।
दिलचस्प, ऐसा लगता है कि डिफ़ॉल्ट रूप से, 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
अक्सर मुद्रा गणनाओं के लिए उपयोग किया जाता है।
बेशक, दोनों मामलों में आप अपना खुद का नंबर प्रारूप प्रदान कर सकते हैं जो आप वास्तव में निर्दिष्ट करते हैं और स्वीकार नहीं करना चाहते हैं ताकि आप उन्हें अपने उपयोग के लिए सुसंगत बना सकें।
कार्यान्वयन दोनों के बीच अलग है:
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]
यह इंगित करना चाहिए कि एक अनुगामी संकेत के रूप में अच्छी तरह से वैध है।
क्या आपके पास अपने कोड नमूने में '.TryParse' होना है? – krillgar
'एरिक लिपर्ट' –
के लिए अच्छा सवाल वे संख्या पार्सर पर अलग-अलग डिफ़ॉल्ट पास करते हैं। 'दशमलव' एक सामान्य धन स्वरूपों को देखने के लिए कॉन्फ़िगर किया गया है और 'डबल' एक नहीं है। – Gabe