从指数表示法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);