首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TryParse失败,返回负数

TryParse失败,返回负数
EN

Stack Overflow用户
提问于 2011-02-08 02:55:01
回答 6查看 18.3K关注 0票数 9

我在让TryParse为我正确工作时遇到了问题。我有一个值列表,我几乎可以肯定它们是有效的(因为它们来自我们系统中的另一个组件),但我希望确保有适当的错误处理。

以下是我的值的示例列表:

20.00

20.00

-150.00

以下是我最初编写的方法:

代码语言:javascript
复制
 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:

代码语言:javascript
复制
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,因为这都在我们的系统中。有没有人看到我可能做错了什么?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-02-08 03:58:39

关于正确使用Decimal.TryParse的方式,其他答案都有正确的想法。但是,如果我正在编写有问题的方法,我会使用LINQ来处理LINQ- to -XML对象:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-02-08 02:58:20

这不是你应该使用TryParse的方式。

TryParse返回一个布尔值(true/false),所以上面的代码应该是:

代码语言:javascript
复制
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;
        }

或者更简洁地说,

代码语言:javascript
复制
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;
        }
票数 11
EN

Stack Overflow用户

发布于 2011-02-08 03:32:45

其他人正在解释如何做对,但并没有真正解释你做错了什么。

上面使用的“success”不是success值,而是被解析的实际数字。所以如果你正在解析"-150.00“,那么成功的结果当然是负的。TryParse的out值是实际的解析值,指示流程是否成功的布尔值是返回值。使用你必须帮助理解的东西将会是这样的:

代码语言:javascript
复制
string inputValue = "-150.00";
decimal numericValue;
bool isSucessful = Decimal.TryParse(inputValue , out numericValue);

在这种情况下,isSuccessful将为TRUE,numericValue将为-150。当您使用用户提供的值而不是我上面使用的硬编码的值时,您需要检查:

代码语言:javascript
复制
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.
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4925215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档