从指数表示法parsing数字

我需要将string“1.2345E-02”(一个用指数表示法表示的数字)parsing为十进制数据types,但是Decimal.Parse("1.2345E-02")只是抛出一个错误

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

 decimal d = Decimal.Parse("1.2345E-02", System.Globalization.NumberStyles.Float); 

它可以工作,如果你指定NumberStyles.Float

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

我不完全确定为什么这不被默认支持 – 默认是使用NumberStyles.Number ,它使用AllowLeadingWhite,AllowTrailingWhite,AllowLeadingSign,AllowTrailingSign,AllowDecimalPoint和AllowThousands样式。 可能是性能相关; 指定一个指数是相对罕见的,我想。

除了指定NumberStyles之外,我build议您使用decimal.TryParse函数,例如:

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

作为NumberStyles.Any的替代方法,如果您确定了自己的格式,则可以使用特定的设置。 例如:

 NumberStyles.AllowExponent | NumberStyles.Float 
  static void Main(string[] args) { decimal d = Decimal.Parse("1.2345E-02", System.Globalization.NumberStyles.Float); } 

我发现传入NumberStyles.Float ,在某些情况下,更改处理string的规则,并导致从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 

我build议使用inputNumberStyles.Number | NumberStyles.AllowExponent NumberStyles.Number | NumberStyles.AllowExponent ,因为这将允许指数数字,并仍然会在decimal规则下处理string。

 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); 

有关使用NumberStyles.Any的警告:

如预期的那样,“6.33E + 03”转换为6330。 在德语中,小数点用逗号表示,但6,33E + 03转换为633000! 这对我的客户来说是一个问题,因为生成数据的文化是不为人知的,并且可能与在数据上运行的文化不同。 在我的情况下,我总是有科学记数法,所以我总是可以在parsing之前将逗号replace为小数点,但是如果您使用的是任意数字,比如像1,234,567这样的相当格式的数字,那么这种方法是行不通的。

请谨慎select答案:在Decimal.Parse中有一个指定System.Globalization.NumberStyles.Float的属性,这可能会导致System.FormatException,因为您的系统可能正在等待使用','而不是'。'格式化的数字。

例如,用法语法表示“1.2345E-02”是无效的,你必须先把它转换成“1,2345E-02”。

总之,请使用以下方面的内容:

 Decimal.Parse(valueString.Replace('.',','), System.Globalization.NumberStyles.Float);