2016-07-22 107 views
3

我在嘗試解析科學記數法中的數字時收到異常。看看如何做的其他職位,我不能告訴我在做什麼有別於那些。C#:科學記數法字符串到Int64轉換失敗

我已經試過如下:

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

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

這些導致出現FormatException:輸入字符串的不正確的格式。

我嘗試這些:

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); 

這些都導致發生OverflowException:值過大或過小。

Int32.Parse也試過,得到了同樣的異常和消息:

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

使用Decimal.Parse作品具有相同字符串參數傳遞給它:

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

This answer建議使用這樣的:

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

其中類似於我的最後一個例子,我只接受所有數字樣式,並且該答案使用負指數。實際上,我將精確的字符串輸入到了我的示例中,而且我仍然會遇到相同的異常。

不知道它是否重要,但我使用的是Unity自帶的版本Mono C#。

以下是C#源文件:https://github.com/Unity-Technologies/mono/blob/unity-staging/mcs/class/corlib/System/Int64.cs。第469行拋出異常,並且在該點之前不提供調用堆棧。但我猜這個異常是在第355行或第372行創建的,因爲這些異常與我顯示的異常類型和消息相匹配。

+0

這是工作,當我在DOTNET小提琴運行它,請參閱https://dotnetfiddle.net/lHWbgM – konkked

+0

這不是工作,當我在DOTNET小提琴運行它:https://dotnetfiddle.net/PvGfoW 編輯:兩個例子中的一個確實有效。 –

+0

意味着具有數字樣式的重載,第一個不會起作用 – konkked

回答

0

我打算假設這是一個與我使用的Mono C#版本有關的錯誤,它隨Unity 5.5.x或更低版本提供。他們的存儲庫can be found here

Their implementation of Int64.Parse甚至不檢查NumberStyles.AllowExponents標誌,或以任何方式處理指數。所以它會在字符串中找到+符號時失敗。基本上,使用Unity時Int64.Parse不支持指數。

Mono's Int32.Parse似乎尋找指數,但仍然導致與我給它的所有指數的OverflowException。

Decimal.Parse實際上與其他兩個參數的工作方式相同,這意味着字符串或參數沒有問題,但這只是其他Parse方法中的一個錯誤。 Decimal的解析與Int解析的完成方式完全不同,因此可以解釋它爲什麼起作用,其他解釋不起作用。

相關問題