我在让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;
}
变量'success'在-150.00返回false,所以我添加了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我感觉很好,因为这都在我们的系统中。有谁看到我可能做错了什么?
答案 0 :(得分:11)
这不是你应该如何使用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;
}
答案 1 :(得分:4)
其他人正在解释如何正确行事,但并没有真正解释你做错了什么。
上面使用“成功”的地方不是成功值,而是正在解析的实际数字。因此,如果您正在解析“-150.00”,那么成功当然是否定的。 TryParse的out值是实际解析的值,指示进程是否成功的boolean是返回值。使用你需要帮助理解的内容将是:
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.
}
答案 2 :(得分:3)
其他答案对于使用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中提取十进制值。
答案 3 :(得分:1)
对于正在解析的负值,您的成功将是负面的。你的if (successful > 0)
正在绊倒你。
如果它们几乎肯定是有效值,请尝试使用Convert.ToDecimal
:
decimal val = Convert.ToDecimal(xElement.Value);
否则,将您的逻辑更改为:
decimal val;
if (Decimal.TryParse(xElement.Value, out val)){
// valid number
}
答案 4 :(得分:0)
我建议你告诉XElement它应该查找哪个节点值,如:
XElement.Element("nodename").Value
而不是XElement.Value。至少这就是我要做的事情:)
答案 5 :(得分:0)
来自Google。回答我的是传入的文化是错误的 - 特别是在传入的JSON文件中。
使用
totalValue += decimal.Parse(xElement.Value, NumberStyles.Any, CultureInfo.InvariantCulture);
或
bool successful = decimal.TryParse(xElement.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out value);