我在让TryParse为我正确工作时遇到了问题。我有一个值列表,我几乎可以肯定它们是有效的(因为它们来自我们系统中的另一个组件),但我希望确保有适当的错误处理。
以下是我的值的示例列表:
20.00
20.00
-150.00
以下是我最初编写的方法:
private decimal CalculateValue(IEnumerable<XElement> summaryValues)
{
decimal totalValue = 0;
foreach (XElement xElement in summaryValues)
{
decimal successful;
Decimal.TryParse(xElement.Value, out successful);
if (successful > 0)
totalValue += Decimal.Parse(xElement.Value);
}
return totalValue;
}变量'successful‘返回false -150.00,所以我添加了NumberStyles:
private decimal CalculateValue(IEnumerable<XElement> summaryValues)
{
decimal totalValue = 0;
foreach (XElement xElement in summaryValues)
{
decimal successful;
Decimal.TryParse(xElement.Value, NumberStyles.AllowLeadingSign, null, out successful);
if (successful > 0)
totalValue += Decimal.Parse(xElement.Value, NumberStyles.AllowLeadingSign);
}
return totalValue;
}但是,现在我有了NumberStyles,所有的数字都不会被解析!我很高兴将IFormatProvider设置为null,因为这都在我们的系统中。有没有人看到我可能做错了什么?
发布于 2011-02-08 03:58:39
关于正确使用Decimal.TryParse的方式,其他答案都有正确的想法。但是,如果我正在编写有问题的方法,我会使用LINQ来处理LINQ- to -XML对象:
private decimal CalculateValue(IEnumerable<XElement> summaryValues)
{
return summaryValues
.Sum(el =>
{
decimal value;
if (Decimal.TryParse(el.Value, out value))
return value;
return 0M;
});
}此版本的工作方式与此完全相同,但它使用Enumerable.Sum方法来计算总数。我所要提供的就是一个从XElement中提取十进制值的内联函数。
发布于 2011-02-08 02:58:20
这不是你应该使用TryParse的方式。
TryParse返回一个布尔值(true/false),所以上面的代码应该是:
private decimal CalculateValue(IEnumerable<XElement> summaryValues)
{
decimal totalValue = 0;
foreach (XElement xElement in summaryValues)
{
decimal valueReturned;
bool successful = Decimal.TryParse(xElement.Value, out valueReturned);
if (successful)
totalValue += valueReturned;
}
return totalValue;
}或者更简洁地说,
private decimal CalculateValue(IEnumerable<XElement> summaryValues)
{
decimal totalValue = 0;
foreach (XElement xElement in summaryValues)
{
decimal valueReturned;
if (Decimal.TryParse(xElement.Value, out valueReturned))
totalValue += valueReturned;
}
return totalValue;
}发布于 2011-02-08 03:32:45
其他人正在解释如何做对,但并没有真正解释你做错了什么。
上面使用的“success”不是success值,而是被解析的实际数字。所以如果你正在解析"-150.00“,那么成功的结果当然是负的。TryParse的out值是实际的解析值,指示流程是否成功的布尔值是返回值。使用你必须帮助理解的东西将会是这样的:
string inputValue = "-150.00";
decimal numericValue;
bool isSucessful = Decimal.TryParse(inputValue , out numericValue);在这种情况下,isSuccessful将为TRUE,numericValue将为-150。当您使用用户提供的值而不是我上面使用的硬编码的值时,您需要检查:
if(isSuccessful)
{
// Do something with numericValue since we know it to be a valid decimal
}
else
{
// Inform User, throw exception, etc... as appropriate, Don't use numericValue because we know it's wrong.
}https://stackoverflow.com/questions/4925215
复制相似问题