TryParse失败,带负数

时间:2011-02-07 18:55:01

标签: c# tryparse

我在让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我感觉很好,因为这都在我们的系统中。有谁看到我可能做错了什么?

6 个答案:

答案 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);