C# Parse抛出一个FormatException

C# Parse抛出一个FormatException,c#,decimal,formatexception,C#,Decimal,Formatexception,我尝试使用decimal.parse,如下所述: 因此,我从本页复制了以下示例: string value; decimal number; value = "1.62345e-02"; try { number = Decimal.Parse(value); Console.WriteLine("'{0}' converted to {1}.", value, number); } catch (FormatExcepti

我尝试使用decimal.parse,如下所述:

因此,我从本页复制了以下示例:

   string value;
   decimal number;
   value = "1.62345e-02";
   try
   {
       number = Decimal.Parse(value);
       Console.WriteLine("'{0}' converted to {1}.", value, number);
   }
   catch (FormatException)
   {
       Console.WriteLine("Unable to parse '{0}'.", value);
   }
我有一个例外, 你知道为什么会这样吗

谢谢, eyal

试试这个:

using System.Globalization;
using System.Text;

....

number = Decimal.Parse(value, NumberStyles.AllowExponent|NumberStyles.AllowDecimalPoint);
为了以指数格式解析数字,您需要按照所述从
NumberStyles枚举设置适当的标志。

当然是正确的。但是如果你允许我的话,我想再解释一下这个问题

让我们看看如何

如您所见,此方法默认使用。它是一种复合数字样式,类似于

这意味着您的字符串可以有一个:

  • 前导和尾随空格(其中返回
    true
  • 当前区域性的前导或尾随符号(和)
  • 您当前的文化
  • 您当前的文化
由于
NumberStyles.Number
具有
AllowDecimalPoint
,因此它适合
字符串,但此样式没有
AllowExponent
,因此它无法解析字符串中的
e-02


这就是为什么需要使用,因为您可以自己指定
numberstyle

线程的区域设置错误,需要,而不是。??在解析中指定CultureInfo。我很确定默认情况下,
Decimal.Parse
不会处理e表示法-您从中复制的文档甚至告诉您这不起作用。谢谢@SergeyBerezovskiy,我试着教他如何钓鱼,而不是给他一条鱼。在大多数情况下(例如,来自文件的输入)您还需要使用NumberFormatInfo.InvariantInfo,即使用重载解析(字符串、NumberStyles、IFormatProvider)。无论您想使用系统区域性还是不变区域性,最好是特定的并传递NumberFormatInfo参数。下一个开发人员可以立即看到小数点等的格式。@Andersforgren不幸的是,OP从未确切地告诉过使用他的
CurrentCulture
。这就是为什么我假设他的文化使用
作为当前文化的
数字CIMALSEPARTOR
。关于使用
IFormatProvider,您有一个观点,在大多数情况下,
会更清楚。但是,
InvariantInfo
与文化无关。它使用
InvariantCulture
设置。这就是为什么总是使用
InvariantInfo
可能不是一个好主意。当然,这些都取决于输入。+1表示详细答案,隐含+1表示背后的哲学。@SonerGönül我同意我们需要更多细节,但不管怎样,最好是明确的:我建议通过CurrentCulture,即使这相当于省略论点。至于Current vs.Invariant,我发现99%的bug(几乎每周都有,因为我在使用小数点逗号的区域性中工作)是由于代码没有考虑到它,并且使用了默认值(系统区域性),即使它们的意思是使用不变量区域性。我几乎从未见过的相反种类的虫子!
public static Decimal Parse(String s)
{
   return Number.ParseDecimal(s, NumberStyles.Number, NumberFormatInfo.CurrentInfo);
}
Number   = AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign | AllowTrailingSign |
           AllowDecimalPoint | AllowThousands,