【问题标题】:How to convert this scientific notation to decimal?如何将此科学记数法转换为十进制?
【发布时间】:2013-07-11 07:35:09
【问题描述】:

在谷歌搜索后,使用下面的代码仍然无法编译

decimal h = Convert.ToDecimal("2.09550901805872E-05");   

decimal h2 = Decimal.Parse(
  "2.09550901805872E-05", 
   System.Globalization.NumberStyles.AllowExponent);

【问题讨论】:

  • 你需要从字符串convert吗?你不能直接输入文字2.09550901805872E-05M吗?
  • 只能编译tryparse
  • 这对我来说编译得很好。你会得到一个运行时异常。
  • @ControlPoly 这是错误的。 TryParse 不会抛出异常,而 Parse 可能会在失败时抛出异常。仅仅因为某事没有引发异常,并不意味着它是正确的。您应该解决问题,即为什么抛出异常(错误格式),而不是症状(异常)。由于格式正确,正确的解决方案是通过正确的标志和区域性设置让 Decimal.Parse 接受格式。

标签: c# decimal


【解决方案1】:

因为小数分隔符(您的字符串中的".")可能因文化而异 使用InvariantCulture 更安全。不要忘记允许这个小数 分隔符 (NumberStyles.Float)

  decimal h = Decimal.Parse(
    "2.09550901805872E-05", 
     NumberStyles.Float | NumberStyles.AllowExponent,
     CultureInfo.InvariantCulture);

竖琴,更方便的代码是当我们使用NumberStyles.Any时:

  decimal h = Decimal.Parse(
    "2.09550901805872E-05", 
     NumberStyles.Any, 
     CultureInfo.InvariantCulture);

【讨论】:

    【解决方案2】:

    您也必须添加NumberStyles.AllowDecimalPoint

    Decimal.Parse("2.09550901805872E-05", NumberStyles.AllowExponent | NumberStyles.AllowDecimalPoint);
    

    MSDN 很清楚:

    表示数字字符串可以是指数表示法。这 AllowExponent 标志允许解析的字符串包含指数 以“E”或“e”字符开头,后跟一个 可选的正号或负号和一个整数。换句话说,它 成功解析 nnnExx、nnnE+xx 和 nnnE-xx 形式的字符串。 它不允许使用小数分隔符或在有效位上签名或 尾数;要允许解析字符串中的这些元素,请使用 AllowDecimalPoint 和 AllowLeadingSign 标志,或使用复合样式 包括这些单独的标志。

    【讨论】:

      【解决方案3】:
      Decimal h2 = 0;
      Decimal.TryParse("2.005E01", out h2);
      

      【讨论】:

      • 不改变h2,保持为0!
      • 这将编译并运行,但您应该始终检查 tryparse 的返回。在这种情况下,它会失败并且 h2 不会更改。
      【解决方案4】:

      使用System.Globalization.NumberStyles.Any

      decimal h2 = Decimal.Parse("2.09550901805872E-05", System.Globalization.NumberStyles.Any);
      

      【讨论】:

      • 如果要使用 TryParse:Decimal.TryParse("2.005E01", System.Globalization.NumberStyles.Any, null, out h2);
      【解决方案5】:
      decimal h = Convert.ToDecimal("2.09550901805872E-05");   
      decimal h2 = decimal.Parse("2.09550901805872E-05", System.Globalization.NumberStyles.Any)
      

      【讨论】:

        【解决方案6】:

        这个帖子对我很有帮助。为了他人的利益,这里是完整的代码:

        var scientificNotationText = someSourceFile;
        // FileTimes are based solely on nanoseconds.
        long fileTime = 0;
        long.TryParse(scientificNotationText, NumberStyles.Any, CultureInfo.InvariantCulture, 
        out fileTime);
        var dateModified = DateTime.FromFileTime(fileTime);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-03-30
          • 2012-10-15
          • 1970-01-01
          • 2018-11-27
          • 2012-11-29
          • 1970-01-01
          相关资源
          最近更新 更多