2015-03-31 60 views
2

我想將轉換字符串返回爲十進制,但少數行引發異常(請參閱下面的代碼)。如何解析包含電子符號的字符串爲十進制

Func<DataRow, string, decimal?> getFieldNullableDecimal = (row, field) => 
{ 
    if (!string.IsNullOrWhiteSpace((row[field] ?? string.Empty).ToString())) 
    { 
     var data = row[field].ToString(); 
     return decimal.Parse(data);   //--this line is throwing exception 
    } 
} 

時由數據庫返回的值是以下形式的被拋出的錯誤:-2.8421709430404E-14

我想這樣做的只是檢查是否字符串「 E-「。然後我將數字轉換兩個部分,然後將它們相乘。但是,在我這樣做之前,我想知道是否存在已經實現的方法。

感謝您的幫助

+2

數據庫中的數據類型是什麼?理想情況下,只要避免做任何字符串操作... – 2015-03-31 15:47:39

+2

是轉換爲字符串真的有必要嗎?看起來好像你有來自數據庫的結構化數據......要麼你已經有了一個數字,在這種情況下你不必做任何事情,或者你有一些數據結構,你可能直接轉換成數字(至少是我會期望在任何相對健全的DBMS API中...) – 2015-03-31 15:47:49

+0

'decimal.Parse(「 - 2.8421709430404E-14」,System.Globalization.NumberStyles.Float);'但更好的選擇是使用['SqlDataReader.GetDecimal'] (https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getdecimal%28v=vs.110%29.aspx)方法,如果您正在與SQL Server數據庫交互。 – Habib 2015-03-31 15:49:24

回答

7

您需要使用NumberStyles.AllowExponent和NumberStyles.Float。例如:

Decimal.Parse("-2.8421709430404E-14", 
       NumberStyles.AllowExponent | NumberStyles.Float); 

事情是這樣的:

if (!string.IsNullOrWhiteSpace((row[field] ?? string.Empty).ToString())) 
{ 
    return decimal.Parse(row[field].ToString(), 
         NumberStyles.AllowExponent | NumberStyles.Float); 
} 

請注意,這是假定你有你的using語句System.Globalization命名空間。例如:

using System.Globalization; 

此外,作爲約翰·斯基特是指出,你不應該需要將其轉換爲一個字符串,然後轉換爲十進制。

如果它是數據庫中的Float,則CLR中的等效項爲Double。所以你可以嘗試將它投射到Double。例如:

return (double)row[field]; 
+0

我添加上面的代碼後仍然收到相同的錯誤。這是從數據庫返回的值「-2.8421709430404E-14」 – Richard77 2015-03-31 16:00:14

+0

我在測試中看到了這一點。嘗試'NumberStyles.AllowExponent | NumberStyles.Float'作爲數字樣式。 – Donal 2015-03-31 16:00:54

+2

儘管這會起作用,但我認爲它是對自制問題的「解決方案」:解析一個字符串值,該字符串值不應該是字符串值。根本沒有必要轉換成一個字符串,然後回到這裏。 – 2015-03-31 16:03:50

相關問題