Antworten:
Es ist eine Gleitkommazahl, Sie müssen sagen, dass:
decimal d = Decimal.Parse("1.2345E-02", System.Globalization.NumberStyles.Float);
Es funktioniert, wenn Sie Folgendes angeben NumberStyles.Float
:
decimal x = decimal.Parse("1.2345E-02", NumberStyles.Float);
Console.WriteLine(x); // Prints 0.012345
Ich bin mir nicht ganz sicher, warum dies nicht standardmäßig unterstützt wird. Standardmäßig NumberStyles.Number
werden die Stile AllowLeadingWhite, AllowTrailingWhite, AllowLeadingSign, AllowTrailingSign, AllowDecimalPoint und AllowThousands verwendet. Möglicherweise ist es leistungsbezogen; Die Angabe eines Exponenten ist vermutlich relativ selten.
decimal
durch double
in meinem Code funktioniert für mich gut, genau wie ich es erwarten würde. Wenn Sie Details zu dem, was Sie versuchen, dem von Ihnen verwendeten Code und dem Ergebnis angeben könnten , wäre es viel einfacher zu helfen.
Zusätzlich zur Angabe der NumberStyles würde ich empfehlen, dass Sie die Funktion decimal.TryParse verwenden, z.
decimal result;
if( !decimal.TryParse("1.2345E-02", NumberStyles.Any, CultureInfo.InvariantCulture, out result) )
{
// do something in case it fails?
}
Als Alternative zu NumberStyles. Sie können einen bestimmten Satz verwenden, wenn Sie sich Ihrer Formate sicher sind. z.B:
NumberStyles.AllowExponent | NumberStyles.Float
decimal d = Decimal.Parse("1.2345E-02", System.Globalization.NumberStyles.Float);
Seien Sie vorsichtig mit der ausgewählten Antwort: Es gibt eine Subtilität, die System.Globalization.NumberStyles.Float in Decimal.Parse angibt. Dies kann zu einer System.FormatException führen, da Ihr System möglicherweise auf eine mit ',' anstelle von ' formatierte Zahl wartet.
In der französischen Notation ist beispielsweise "1.2345E-02" ungültig. Sie müssen es zuerst in "1.2345E-02" konvertieren.
Verwenden Sie abschließend etwas in der Art von:
Decimal.Parse(valueString.Replace('.',','), System.Globalization.NumberStyles.Float);
Ich habe festgestellt, dass das Übergeben in NumberStyles.Float
einigen Fällen die Regeln ändert, nach denen die Zeichenfolge verarbeitet wird, und zu einer anderen Ausgabe führt als NumberStyles.Number
(die von verwendeten Standardregeln decimal.Parse
).
Der folgende Code generiert beispielsweise ein FormatException
in meinem Computer:
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
Ich würde empfehlen, die Eingabe zu verwenden NumberStyles.Number | NumberStyles.AllowExponent
, da dies Exponentialzahlen zulässt und die Zeichenfolge weiterhin gemäß den decimal
Regeln verarbeitet.
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
Um die Frage des Posters zu beantworten, sollte die richtige Antwort stattdessen lauten:
decimal x = decimal.Parse("1.2345E-02", NumberStyles.Number | NumberStyles.AllowExponent);
Console.WriteLine(x);
Warnung zur Verwendung von NumberStyles.Any:
"6.33E + 03" wird wie erwartet in 6330 konvertiert. Im Deutschen werden Dezimalstellen durch Kommas dargestellt, aber 6,33E + 03 werden in 633000 konvertiert! Dies ist ein Problem für meine Kunden, da die Kultur, die die Daten generiert, nicht bekannt ist und sich möglicherweise von der Kultur unterscheidet, die mit den Daten arbeitet. In meinem Fall habe ich immer eine wissenschaftliche Notation, daher kann ich vor dem Parsen immer das Komma durch einen Dezimalpunkt ersetzen. Wenn Sie jedoch mit beliebigen Zahlen wie hübsch formatierten Zahlen wie 1.234.567 arbeiten, funktioniert dieser Ansatz nicht.
Sie müssen die Punkte (bzw. Kommas) nicht ersetzen, sondern geben nur die Eingabe IFormatProvider an:
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"));
Wenn Sie den Exponentenwert überprüfen und konvertieren möchten, verwenden Sie diesen
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);
}
Hoffe das hilft jemandem.