2015-03-31 61 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

相关问题