如何将包含E符号的字符串解析为十进制

Ric*_*d77 2 c# bigdecimal

我想将转换字符串返回到十进制,但很少有行抛出异常(请参阅下面的代码).

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
   }
 }
Run Code Online (Sandbox Code Playgroud)

当数据库返回的值具有以下格式时,将引发错误:-2.8421709430404E-14

我想做的只是检查字符串是否为" E- ".然后,我将转换两个部分的数量,然后乘以它们.但是,在我这样做之前,我想知道是否存在已经存在的方法.

谢谢你的帮助

Don*_*nal 7

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

Decimal.Parse("-2.8421709430404E-14", 
              NumberStyles.AllowExponent | NumberStyles.Float);
Run Code Online (Sandbox Code Playgroud)

像这样的东西:

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

请注意,这假设您在using语句中具有System.Globalization命名空间.例如:

using System.Globalization;
Run Code Online (Sandbox Code Playgroud)

或者,正如John Skeet指出的那样,您不需要将其转换为字符串然后再转换为小数.

如果它是数据库中的Float,则CLR中的等效项为Double.所以你可以尝试将其转换为Double.例如:

return (double)row[field];
Run Code Online (Sandbox Code Playgroud)

  • @Donal:我只是将它转换为`double`而不是使用`Convert.ToDouble`.(我希望它可以工作.)但是如果OP需要一个`十进制',这表明某处存在问题 - 要么他应该使用`double`,要么数据库应该使用十进制浮点类型. . (3认同)
  • 虽然这会起作用,但我将其视为自制问题的"解决方案":首先解析不应该是字符串值的字符串值.根本不需要转换为字符串并返回此处. (2认同)