2014-05-12 11 views
5

Ich versuchte, die Decimal.Parse zu verwenden, wie bei beschrieben: http://msdn.microsoft.com/en-us/library/cafs243z(v=vs.110).aspxDecimal.Parse wirft einen Format

Also ich auf dieser Seite kopiert folgendes Beispiel:

string value; 
    decimal number; 
    value = "1.62345e-02"; 
    try 
    { 
     number = Decimal.Parse(value); 
     Console.WriteLine("'{0}' converted to {1}.", value, number); 
    } 
    catch (FormatException) 
    { 
     Console.WriteLine("Unable to parse '{0}'.", value); 
    } 

und ich bekam eine Format, Hast du eine Idee, warum es passiert ist?

Dank, eyal

+1

Falsches Gebietsschema für den Thread, erwartet ein, anstatt eines. ??? – TomTom

+0

Geben Sie CultureInfo in Parse ein. – Xaruth

+1

Ich bin mir ziemlich sicher, dass "Decimal.Parse" standardmäßig nicht mit der e-Notation arbeitet - die Dokumentation, von der du das kopiert hast, sagt dir sogar, dass das nicht funktionieren wird. –

Antwort

5
diese

Versuchen:

using System.Globalization; 
using System.Text; 

.... 

number = Decimal.Parse(value, NumberStyles.AllowExponent|NumberStyles.AllowDecimalPoint); 

Um eine Zahl im exponentiellen Format zu analysieren, müssen Sie die entsprechenden Flags von NumberStyles Enumeration setzen, wie here beschrieben.

5

shree.pat18's answer ist natürlich richtig. Aber ich möchte diese Frage ein wenig mehr erklären, wenn Sie mich lassen ..

ist, wie Decimal.ToParse(string) methodimplemented aussehen lassen;

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

Wie Sie sehen können, ist diese Methode verwendet NumberStyles.Number standardmäßig. Es ist ein zusammengesetzter Zahlenstil und es ist implemented like;

Number = AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign | AllowTrailingSign | 
      AllowDecimalPoint | AllowThousands, 

Das bedeutet, dass Ihre Zeichenfolge eines haben kann;

Seit NumberStyles.Number hat AllowDecimalPoint, es passt . in Ihre Zeichenfolge, aber dieser Stil hat keine AllowExponent, deshalb kann es e-02 in Ihrer Zeichenfolge nicht analysieren.

Deshalb müssen Sie Decimal.Parse Method (String, NumberStyles) overload verwenden, da Sie NumberStyles selbst angeben können.

+1

Sehr gute Erklärung –

+1

Danke @SergeyBerezovskiy Ich versuche ihm beizubringen, wie man fischt, anstatt ihm einen Fisch zu geben. –

+0

In den meisten Fällen (z. B. Eingabe von Dateien) möchten Sie auch NumberFormatInfo.InvariantInfo verwenden, das heißt, verwenden Sie die Überladung Parse (String, NumberStyles, IFormatProvider). Unabhängig davon, ob Sie die Systemkultur oder einen invarianten Kulturfall verwenden möchten, ist es am besten, spezifisch zu sein und ein NumberFormatInfo-Argument zu übergeben. Der nächste Entwickler kann sofort sehen, welches Format von Dezimalstellen usw. erwartet wird. –