C# Parse抛出一个FormatException
我尝试使用decimal.parse,如下所述: 因此,我从本页复制了以下示例: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
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,