2014-04-28 86 views
1

我有一個包含字符串值一個gridview但數/整數無效字符串格式

例如:「1」,「10」

問題是我也有,這是-上的數據它和它的一個字符它不能轉換爲整數。

這裏是我的拉姆達行:

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 = numberstring ...

-值不0 ...只是要排除所有那些誰擁有-和轉換利潤爲int。提前致謝!

+0

是' - 「記錄中唯一的東西(也許意味着沒有該單元格的值),或者它是數字的一部分(比如'-5')?你真的在問如何從總和中排除負數(你的代碼已經用'> = 0'完成了)? –

+0

@GrantWinney不,只是具有「 - 」值的數據,所以我不能使用.contains爲什麼負數也包含「 - 」 – Elegiac

+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 

,並返回them.If的總和,你不希望包括負數只是刪除的首要條件。 if (x.Profit.StartsWith("-"))

UPDATE:如果你想讓它更簡單,和你的價值觀不包含任何逗號,你可以只使用

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

您與-比較Profit在你的代碼中。但可能你的一些值是以-開頭的,所以你會得到格式異常。請改用ContainsStartsWith方法。

Convert.ToInt32(n.Profit) 

這將拋出一個異常,如果你想轉換的字符串實際上不是一個整數:

+0

什麼是「。」和「,」 – Elegiac

+0

@Elegiac你不用**雙打**嗎? –

+0

使用.contains是可以的這種情況,但我有其他lambdas搜索負數,所以我不能使用.Contains(「 - 」)我想...我只是想排除確切的「 - 」(短劃線)值不爲負 – Elegiac

0

你的問題的事實,你有這條線在您的第一條語句莖。既然你顯然是在處理利潤,你最有可能得到小數。

替換上面這一點,你的代碼應該工作:

Convert.ToDecimal(n.Profit) 

(我推薦使用Decimal而不是Doublewhen dealing with money

+0

將其轉換爲Decimal似乎在這種情況下工作...生病只是在我的其他lambda上嘗試它,如果它工作不正常接受此答案 – Elegiac