无效的字符串格式

时间:2014-04-28 03:15:26

标签: c# lambda

我有一个包含字符串值但是数字/整数

的gridview
  

例如:“1”,“10”

问题是我的数据也是-,因为它的char不能转换为整数。

这是我的lambda的一行:

var gp_lt = gridData.Where(n => n.Profit != "-" && Convert.ToInt32(n.Profit) >= 0).Select(o => new { o.Profit });
double grossprofit_LT = gp_lt.Sum(o => Convert.ToDouble(o.Profit));

Profit = number但是string ...

-的值不是0 ...只想排除所有拥有-并将利润转换为int的人。提前谢谢!

2 个答案:

答案 0 :(得分:0)

尝试:

double grossprofit_LT = gridData.Select(x =>
        {
            var styles = NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint;
            if (x.Profit.StartsWith("-"))
                return (double?) double.Parse(x, styles);

            if (x.Profit.Contains('.'))
                return (double?) double.Parse(x,styles, CultureInfo.InvariantCulture);

            var seperator = CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator;

            if (x.Profit.Contains(',') && seperator == ",") 
               return (double?) double.Parse(x, styles);

            return null;
        }).Where(x => x.HasValue).Sum(x => x.Value);

这将处理所有值,如:

-3
-2.23
1,15

并返回你的总和。如果你不想包含负数,只需删除第一个条件。 if (x.Profit.StartsWith("-"))

更新:如果您想让它更简单,并且您的值不包含任何逗号,您可以使用

gridData.Where(x => !x.Profit.Contains("-"))
        .Select(x => double.Parse(x.Profit.Trim())
        .Sum();

您在代码中将Profit-进行了比较。但是您的某些值可能以-开头,因此您将获得格式异常。使用Contains或而是StartsWith方法。

答案 1 :(得分:0)

您的问题源于您在第一个陈述中有这一行:

Convert.ToInt32(n.Profit)

如果您尝试转换的字符串实际上不是整数,那么会抛出异常。由于您显然处理的是利润,因此您很可能获得了小数。

将上面的内容替换为此,您的代码应该有效:

Convert.ToDecimal(n.Profit)

(我建议使用 Decimal 而不是 Double when dealing with money 。)