代码之家  ›  专栏  ›  技术社区  ›  Jimbo

从指数表示法分析一个数字

  •  72
  • Jimbo  · 技术社区  · 15 年前

    我需要将字符串“1.2345E-02”(指数表示法的数字)解析为十进制数据类型,但是 Decimal.Parse("1.2345E-02") 只是抛出一个错误

    7 回复  |  直到 7 年前
        1
  •  149
  •   Hans Passant    15 年前

    它是一个浮点数,您必须告诉它:

    decimal d = Decimal.Parse("1.2345E-02", System.Globalization.NumberStyles.Float);
    
        2
  •  44
  •   Jon Skeet    15 年前

    如果你指定的话,它会起作用。 NumberStyles.Float :

    decimal x = decimal.Parse("1.2345E-02", NumberStyles.Float);
    Console.WriteLine(x); // Prints 0.012345
    

    我不完全确定为什么默认情况下不支持这个——默认情况是使用 NumberStyles.Number ,它使用allowledingwhite、allowledingwhite、allowledingsign、allowtrailingsign、allowdecimalpoint和allowthousands样式。可能与性能有关;指定指数是 相当地 我想很少见。

        3
  •  31
  •   Sverrir Sigmundarson    13 年前

    除了指定数字样式外,我建议您使用 十进制.色氨酸 功能如下:

    decimal result;
    if( !decimal.TryParse("1.2345E-02", NumberStyles.Any, CultureInfo.InvariantCulture, out result) )
    {
         // do something in case it fails?
    }
    

    作为数字样式的替代。如果您确定格式,可以使用特定的集合。例如:

    NumberStyles.AllowExponent | NumberStyles.Float
    
        4
  •  10
  •   Mitch Wheat    7 年前
    decimal d = Decimal.Parse("1.2345E-02", System.Globalization.NumberStyles.Float);
    
        5
  •  7
  •   KwentRell    9 年前

    注意所选答案:有一个副标题指定 system.globalization.numberStyles.float 在里面 十进制分析 这可能导致 System.Format异常 因为您的系统可能正在等待一个格式为“,”而不是“.”的数字。

    例如,在法语表示法中,“1.2345E-02”无效,必须先将其转换为“12345E-02”。

    综上所述,使用以下方面的内容:

    Decimal.Parse(valueString.Replace('.',','), System.Globalization.NumberStyles.Float);
    
        6
  •  3
  •   bastos.sergio    8 年前

    我发现那是路过 NumberStyles.Float 在某些情况下,更改处理字符串的规则,并导致不同的输出 NumberStyles.Number (使用的默认规则 decimal.Parse )

    例如,以下代码将生成 FormatException 在我的机器里:

    CultureInfo culture = new CultureInfo("");
    culture.NumberFormat.NumberDecimalDigits = 2;
    culture.NumberFormat.NumberDecimalSeparator = ".";
    culture.NumberFormat.NumberGroupSeparator = ",";
    Decimal.Parse("1,234.5", NumberStyles.Float, culture); // FormatException thrown here
    

    我建议使用输入 NumberStyles.Number | NumberStyles.AllowExponent ,因为这将允许指数,并且仍将处理 decimal 规则。

    CultureInfo culture = new CultureInfo("");
    culture.NumberFormat.NumberDecimalDigits = 2;
    culture.NumberFormat.NumberDecimalSeparator = ".";
    culture.NumberFormat.NumberGroupSeparator = ",";
    Decimal.Parse("1,234.5",NumberStyles.Number | NumberStyles.AllowExponent, culture); // Does not generate a FormatException
    

    要回答海报的问题,正确的答案应该是:

    decimal x = decimal.Parse("1.2345E-02", NumberStyles.Number | NumberStyles.AllowExponent);
    Console.WriteLine(x);
    
        7
  •  1
  •   David Kitzinger    10 年前

    关于使用数字样式的警告。任何:

    “6.33E+03”按预期转换为6330。在德语中,小数点用逗号表示,但6,33e+03转换为633000!这对我的客户来说是个问题,因为生成数据的区域性未知,可能与对数据进行操作的区域性不同。在我的例子中,我总是有科学的符号,所以我总是可以在解析之前将逗号替换为小数点,但是如果您使用的是任意的数字,比如1234567这样的格式很好的数字,那么这种方法就不起作用。

    推荐文章