2014-05-12 61 views
5

我試圖用decimal.parse如描述: http://msdn.microsoft.com/en-us/library/cafs243z(v=vs.110).aspxDecimal.Parse拋出一個出現FormatException

所以我從這個頁面複製下面的例子:

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

,我得到一個出現FormatException, 你知道爲什麼發生了嗎?

感謝, 的Eyal

+1

錯誤的線程區域設置,期待一個,而不是一個。??? – TomTom

+0

在Parse中指定CultureInfo。 – Xaruth

+1

我很確定'Decimal.Parse'默認情況下不處理e符號 - 你從這個文檔複製的文檔告訴你這是行不通的。 –

回答

5

試試這個:

using System.Globalization; 
using System.Text; 

.... 

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

爲了分析在指數格式的數字,你需要描述hereNumberStyles Enumeration設置相應的標誌。

5

shree.pat18's answer當然是對的。但我想解釋這個問題多一點,如果你讓我..

讓我們來看看如何Decimal.ToParse(string) methodimplemented;

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

如您所見,此方法默認使用NumberStyles.Number。它是一個複合數字樣式,它的樣子是implemented;

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

這意味着你的字符串可以有一個;

由於NumberStyles.NumberAllowDecimalPoint,它適合.在你的字符串,但這種風格沒有AllowExponent這就是爲什麼它不能在你的字符串中解析e-02

這就是爲什麼您需要使用Decimal.Parse Method (String, NumberStyles) overload,因爲您可以自己指定NumberStyles

+1

非常好的解釋 –

+1

謝謝@SergeyBerezovskiy我嘗試教他如何釣魚,而不是給他一條魚。 –

+0

在大多數情況下(例如來自文件的輸入),您還需要使用NumberFormatInfo.InvariantInfo,它使用重載Parse(String,NumberStyles,IFormatProvider)。無論您想使用系統文化還是不變文化案例,最好都是特定的,並傳遞NumberFormatInfo參數。下一位開發人員可以立即看到預期的小數點等格式。 –

相關問題