2011-02-07 55 views
7

失敗。我有我幾乎可以肯定地值的列表是有效的(因爲他們從我們的系統中的另一個組件),但我想,以確保有適當的錯誤搬運就位。的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; 
     } 

變量 '成功'爲-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感到滿意,因爲這些都在我們的系統中。有沒有人看到我可能做錯了什麼?

+2

你爲什麼要分析它的兩倍? – SLaks

回答

3

其他的答案已經得到了正確的想法關於使用Decimal.TryParse的正確方法。但是,如果我在寫有問題的方法,我會使用LINQ使用LINQ到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中提取十進制值。

+0

謝謝,我結束了使用這段代碼。 – Jeannine

11

這不是你應該如何使用的TryParse。

的TryParse返回一個布爾值(真/假),這樣你上面的代碼應該是:

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

'if(!Decimal.TryParse(/ * derp * /)拋出新的InvalidOperationException(「OMG WTF LOL」) – Will

+0

@Will在這個例子中,他應該有一個像這樣的異常,即使他合理地相信源碼。可能會出現這樣的情況,你希望並且想要默默地忽略那些不解析的字符串 –

1

你的成功將是負的負值被解析。你的if (successful > 0)是什麼讓你絆倒。

如果他們幾乎肯定將是有效的值,請嘗試使用Convert.ToDecimal

decimal val = Convert.ToDecimal(xElement.Value); 

否則,改變你的邏輯有點更像:

decimal val; 
if (Decimal.TryParse(xElement.Value, out val)){ 
    // valid number 
} 
0

我建議你告訴XElement它應該查找哪個節點值:

XElement.Element("nodename").Value 

Instea d的XElement.Value。至少這是我會做的:)

4

其他人正在解釋如何做到這一點,但沒有真正解釋你做錯了什麼。

上面使用「成功」的地方不是成功值,它是正在分析的實際數字。所以,如果你解析「-150.00」當然成功將是負面的。 TryParse的out值是實際分析的值,並且指示進程是否成功的布爾值是返回的值。使用你必須理解的內容會是這樣的:

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. 
} 
+0

是的,這是問題的根源,謝謝你對edumacating的支持:) – Jeannine

0

來自Google。對我來說,接收的文化是錯誤的 - 特別是在傳入的JSON文件中。

使用

totalValue += decimal.Parse(xElement.Value, NumberStyles.Any, CultureInfo.InvariantCulture); 

bool successful = decimal.TryParse(xElement.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out value);