TryParse失败,带负数

Jea*_*ine 7 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;
        }
Run Code Online (Sandbox Code Playgroud)

变量'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;
        }
Run Code Online (Sandbox Code Playgroud)

但是,现在我在那里有NumberStyles,没有数字会解析!将IFormatProvider设置为null我感觉很好,因为这都在我们的系统中.有谁看到我可能做错了什么?

Chr*_*ain 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;
        }
Run Code Online (Sandbox Code Playgroud)

或者更简洁,

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;
        }
Run Code Online (Sandbox Code Playgroud)


Joe*_*ler 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;
             });
}
Run Code Online (Sandbox Code Playgroud)

此版本的工作方式完全相同,但它使用Enumerable.Sum方法来计算总数。我所需要提供的只是一个从 XElement 中提取十进制值的内联函数。