2016-07-22 7 views
3

Ich bekomme eine Ausnahme, wenn ich versuche, eine Zahl in wissenschaftlicher Notation zu analysieren. Andere Beiträge darüber, wie es geht, und ich kann nicht sagen, was ich anders mache als diese.C#: Wissenschaftliche Notation String zu Int64-Konvertierung fehlgeschlagen

Ich habe versucht, die folgenden:

System.Convert.ToInt64("1.0206e+06"); 

System.Convert.ToInt64("1.0206E+06"); // Uppercase 'E' 

Diese resultieren in einer Format: Eingabezeichenfolge war nicht im richtigen Format.

Ich habe versucht, diese:

Int64.Parse("1.0206e+06", System.Globalization.NumberStyles.Any); 

Int64.Parse("1.0206e+06", System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture); 

Int64.Parse("1.0206e+06", System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture); 

Diese alle Ergebnis in einem Overflow: Wert zu groß oder zu klein war.

versuchte auch mit Int32.Parse und bekam die gleiche Ausnahme und Nachricht:

(long)Int32.Parse(str, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture); 

Mit Decimal.Parse Arbeiten mit der gleichen Zeichenkette und Parameter an sie übergeben:

(long)Decimal.Parse(str, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture); 

This answer schlägt dies mit:

Double.Parse("1.234567E-06", System.Globalization.NumberStyles.Float); 

Welche ist meinem letzten Beispiel ähnlich, ich akzeptiere einfach alle Zahlenarten, und diese Antwort verwendet einen negativen Exponenten. Tatsächlich fütterte ich diese exakte Zeichenfolge in meine Beispiele und ich bekomme immer noch dieselben Ausnahmen.

Nicht sicher, ob es wichtig ist, aber ich verwende Mono C#, die Version, die mit Unity kommt.

Hier ist die C# Quelldatei: https://github.com/Unity-Technologies/mono/blob/unity-staging/mcs/class/corlib/System/Int64.cs. Die Ausnahme wird in Zeile 469 ausgelöst und stellt mir vor diesem Zeitpunkt keinen Aufruf-Stack zur Verfügung. Aber ich vermute, dass die Ausnahme in Zeile 355 oder 372 erstellt wird, da diese dem Ausnahmetyp und der Nachricht entsprechen, die mir angezeigt werden.

+0

Dies funktioniert, wenn ich es in Dotnet Geige laufen, siehe https://dotnetfiddle.net/lHWbgM – konkked

+0

Diese funktioniert nicht, wenn ich es in Dotnet Geige laufen: https://dotnetfiddle.net/PvGfoW EDIT : Eines der beiden Beispiele funktioniert. –

+0

bedeutete die Überladungen, die Zahlenarten haben, die erste wird nicht funktionieren – konkked

Antwort

0

Ich gehe davon aus, dass dies ein Fehler mit der Version von Mono C# ist, die ich verwende, die mit Unity 5.5.x oder früher kommt. Ihr Repository can be found here.

Their implementation of Int64.Parse überprüft nicht einmal die NumberStyles.AllowExponents Flagge, oder behandeln Exponenten in irgendeiner Weise. Es wird also fehlschlagen, wenn es das + Symbol in der Zeichenfolge findet. Grundsätzlich unterstützt Int64.Parse bei Verwendung von Unity keine Exponenten.

Mono's Int32.Parse scheint nach Exponenten suchen, verursacht aber immer noch eine OverflowException mit allen Exponenten, die ich es geben.

Decimal.Parse funktioniert tatsächlich mit den gleichen Parametern wie die anderen beiden, was darauf hindeutet, dass nichts mit der Zeichenfolge oder den Parametern falsch war, aber es ist nur ein Fehler in ihren anderen Parse-Methoden. Das Parsen von Decimal unterscheidet sich vollständig von dem, wie das Int-Parsing durchgeführt wird, so dass es erklären kann, warum es funktioniert und die anderen nicht.

Verwandte Themen