2011-02-07 10 views
7

TryParseが正常に動作するのに問題があります。私はほぼ確実な値のリストを持っています(彼らはシステムの別のコンポーネントから来ています)が、適切なエラー処理が行われていることを確認したいと思います。ここでTryParseが負の数で失敗しています

は、私の値の例のリストです:

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; 
     } 

変数 '成功':

20.00
20.00
-150.00

そして、ここでは、私はもともと書いた方法があります-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

:あなたは、ユーザーが提供する値の代わりに、私はあなたがチェックしたいと思う上で使用ハードコードされたものを使用しているとき。

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メソッドを使用しています。私は問題の方法を書いていた場合は、私は、LINQからXMLオブジェクトを操作するためにLINQを使用したいです合計。私が提供しなければならないのは、XElementから10進値を抽出するインライン関数です。

+0

ありがとう、私はこのコードを使用して終了しました。 – Jeannine

11

これは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 * /)throw new InvalidOperationException(" OMG WTF LOL ") – Will

+0

@Willこの例では、彼はこのような例外を持つ必要があります_evenなら彼は合理的にソースを信頼します。 –

1

あなたの成功が負の値をマイナスになるだろう:上記のコードはする必要がありますので、ブール(真/偽)を返しますTryParse

解析されます。あなたの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 XElement.Valueのd。少なくともそれは私がやることです:)

4

他の人はそれを正しく行う方法を説明していますが、実際にあなたが間違っていることを説明していません。

上記の「成功」を使用しているのは、成功した値ではなく、実際に解析されている数値です。したがって、あなたが "-150.00"を解析しているなら、もちろん成功は否定的です。 TryParseのout値は実際の解析された値であり、プロセスが成功したかどうかを示すブール値が戻り値です。ようなものになるだろうあなたが理解を助けるために持っているものの使用:この場合

string inputValue = "-150.00"; 
decimal numericValue; 
bool isSucessful = Decimal.TryParse(inputValue , out numericValue); 

、isSuccessfulとはTRUEになり、numericValueは-150になります。他の回答がDecimal.TryParseを使用する適切な方法に関して正しい考えを持っている

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); 
関連する問題