मुझे दशमलव डेटा प्रकार के लिए "1.2345E-02" (घातांक अंकन में व्यक्त संख्या) स्ट्रिंग को पार्स करने की आवश्यकता है, लेकिन Decimal.Parse("1.2345E-02")
बस एक त्रुटि फेंकता है
जवाबों:
यदि आप निर्दिष्ट करते हैं तो यह काम करता है NumberStyles.Float
:
decimal x = decimal.Parse("1.2345E-02", NumberStyles.Float);
Console.WriteLine(x); // Prints 0.012345
मुझे पूरी तरह से यकीन नहीं है कि यह डिफ़ॉल्ट रूप से समर्थित क्यों नहीं है - डिफ़ॉल्ट का उपयोग करना है NumberStyles.Number
, जो AllowLeadingWhite, AllowTrailingWhite, AllowLeadingSign, AllowTrailingSign, AllowDecimalPoint, और AllowThousands शैलियों का उपयोग करता है। संभवतः यह प्रदर्शन-संबंधी है; प्रतिपादक निर्दिष्ट करना अपेक्षाकृत दुर्लभ है, मुझे लगता है।
decimal
साथ प्रतिस्थापित करना double
मेरे लिए ठीक काम करता है, जैसे मैं उससे उम्मीद करता हूं। आप प्रदान कर सकता है विवरण आप की कोशिश कर रहे हैं की, कोड का उपयोग कर रहे है, और परिणाम है, यह ज्यादा मदद करने के लिए आसान होगा।
NumberStyles निर्दिष्ट करने के अतिरिक्त मैं सुझाव है कि आप का उपयोग decimal.TryParse जैसे समारोह:
decimal result;
if( !decimal.TryParse("1.2345E-02", NumberStyles.Any, CultureInfo.InvariantCulture, out result) )
{
// do something in case it fails?
}
NumberStyles के विकल्प के रूप में। यदि आप अपने स्वरूपों के बारे में निश्चित हैं तो आप एक विशिष्ट सेट का उपयोग कर सकते हैं। उदाहरण के लिए:
NumberStyles.AllowExponent | NumberStyles.Float
चयनित उत्तर के बारे में सतर्क रहें: एक सूक्ष्मता निर्दिष्ट करना है System.Globalization.NumberStyles.Float में Decimal.Parse जो एक System.FormatException को जन्म दे सकता है क्योंकि आपके सिस्टम को 'के बजाय', 'के साथ एक संख्या का इंतजार करना पड़ सकता है।'
उदाहरण के लिए, फ्रेंच संकेतन में, "1.2345E-02" अमान्य है, आपको इसे पहले "1,2345E-02" में बदलना होगा।
निष्कर्ष में, की तर्ज पर कुछ का उपयोग करें:
Decimal.Parse(valueString.Replace('.',','), System.Globalization.NumberStyles.Float);
मैंने पाया है कि NumberStyles.Float
कुछ मामलों में पास होना, उन नियमों में बदलाव करता है जिनके द्वारा स्ट्रिंग को संसाधित किया जाता है और इसके परिणामस्वरूप एक अलग आउटपुट NumberStyles.Number
(डिफ़ॉल्ट नियमों का उपयोग किया जाता है decimal.Parse
) होता है।
उदाहरण के लिए, निम्नलिखित कोड FormatException
मेरी मशीन में एक उत्पन्न करेगा :
CultureInfo culture = new CultureInfo("");
culture.NumberFormat.NumberDecimalDigits = 2;
culture.NumberFormat.NumberDecimalSeparator = ".";
culture.NumberFormat.NumberGroupSeparator = ",";
Decimal.Parse("1,234.5", NumberStyles.Float, culture); // FormatException thrown here
मैं इनपुट का उपयोग करने की सलाह देता हूं NumberStyles.Number | NumberStyles.AllowExponent
, क्योंकि यह घातीय संख्याओं की अनुमति देगा और अभी भी decimal
नियमों के तहत स्ट्रिंग की प्रक्रिया करेगा ।
CultureInfo culture = new CultureInfo("");
culture.NumberFormat.NumberDecimalDigits = 2;
culture.NumberFormat.NumberDecimalSeparator = ".";
culture.NumberFormat.NumberGroupSeparator = ",";
Decimal.Parse("1,234.5",NumberStyles.Number | NumberStyles.AllowExponent, culture); // Does not generate a FormatException
पोस्टर के प्रश्न का उत्तर देने के लिए, इसके बजाय सही उत्तर होना चाहिए:
decimal x = decimal.Parse("1.2345E-02", NumberStyles.Number | NumberStyles.AllowExponent);
Console.WriteLine(x);
NumberStyles.Any का उपयोग करने के बारे में चेतावनी:
"6.33E + 03" उम्मीद के अनुसार 6330 में परिवर्तित होता है। जर्मन में, दशमलव बिंदुओं को अल्पविराम द्वारा दर्शाया जाता है, लेकिन 6,33E + 03 633000 में परिवर्तित होता है! यह मेरे ग्राहकों के लिए एक समस्या है, क्योंकि डेटा उत्पन्न करने वाली संस्कृति ज्ञात नहीं है और उस संस्कृति से भिन्न हो सकती है जो डेटा पर काम कर रही है। मेरे मामले में, मेरे पास हमेशा वैज्ञानिक संकेतन होता है, इसलिए मैं पार्सिंग से पहले हमेशा कॉमा को दशमलव बिंदु तक बदल सकता हूं, लेकिन यदि आप मनमाने ढंग से संख्याओं के साथ काम कर रहे हैं, जैसे सुंदर स्वरूपित संख्या जैसे 1,234,567 तो वह दृष्टिकोण काम नहीं करता है।
आपको डॉट्स को बदलने की आवश्यकता नहीं है (क्रमशः कॉमा) बस इनपुट IFormatProvider निर्दिष्ट करें:
float d = Single.Parse("1.27315", System.Globalization.NumberStyles.Float, new CultureInfo("en-US"));
float d = Single.Parse("1,27315", System.Globalization.NumberStyles.Float, new CultureInfo("de-DE"));
यदि आप घातांक मान को जाँचना और परिवर्तित करना चाहते हैं तो इसका उपयोग करें
string val = "1.2345E-02";
double dummy;
bool hasExponential = (val.Contains("E") || val.Contains("e")) && double.TryParse(val, out dummy);
if (hasExponential)
{
decimal d = decimal.Parse(val, NumberStyles.Float);
}
आशा है कि यह किसी की मदद करता है।