我需要将字符串“ 1.2345E-02”(用指数表示法表示的数字)解析为十进制数据类型,但Decimal.Parse("1.2345E-02")
只会引发错误
Answers:
如果您指定,它将起作用NumberStyles.Float
:
decimal x = decimal.Parse("1.2345E-02", NumberStyles.Float);
Console.WriteLine(x); // Prints 0.012345
我不完全确定为什么默认情况下不支持此功能-默认值为use NumberStyles.Number
,它使用AllowLeadingWhite,AllowTrailingWhite,AllowLeadingSign,AllowTrailingSign,AllowDecimalPoint和AllowThousands样式。可能与性能有关;我想指定一个指数是相对罕见的。
decimal
用double
我的代码替换对我来说很好用。如果您可以提供有关您要执行的操作,正在使用的代码以及结果的详细信息,那么将很容易获得帮助。
除了指定NumberStyles外,我还建议您使用decimal.TryParse函数,例如:
decimal result;
if( !decimal.TryParse("1.2345E-02", NumberStyles.Any, CultureInfo.InvariantCulture, out result) )
{
// do something in case it fails?
}
作为NumberStyles的替代方法,只要确定格式,任何人都可以使用特定的集合。例如:
NumberStyles.AllowExponent | NumberStyles.Float
请谨慎选择答案:存在一个指定System.Globalization.NumberStyles.Float的替代性在Decimal.Parse中的子类,可能会导致System.FormatException,因为您的系统可能正在等待以','而不是'。'格式的数字。
例如,以法语表示法,“ 1.2345E-02”无效,您必须首先将其转换为“ 1,2345E-02”。
总之,使用以下内容:
Decimal.Parse(valueString.Replace('.',','), System.Globalization.NumberStyles.Float);
我发现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
我建议使用input 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);