9

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

変数 'successful' は -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 に設定することに満足しています。私が間違っているかもしれないことを誰かが見ていますか?

4

6 に答える 6

11

これは、TryParseの使用方法ではありません。

TryParseはブール値(true / false)を返すため、上記のコードは次のようになります。

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;
        }
于 2011-02-07T18:58:19.773 に答える
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.
}
于 2011-02-07T19:32:44.957 に答える
3

他の回答は、の適切な使用方法に関して正しい考えを持っていますDecimal.TryParse。ただし、問題のメソッドを記述している場合は、LINQを使用してLINQ-to-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から10進値を抽出するインライン関数だけです。

于 2011-02-07T19:58:39.317 に答える
2

グーグルから来ました。私への答えは、着信カルチャが間違っていたということでした-特に着信JSONファイルで。

使用する

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

また

bool successful = decimal.TryParse(xElement.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out value);
于 2016-06-03T20:04:25.410 に答える
1

解析される負の値に対して、成功は負になります。あなたif (successful > 0)はあなたをつまずかせているものです。

それらがほぼ確実に有効な値になる場合は、次を使用してみてくださいConvert.ToDecimal

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

それ以外の場合は、ロジックを少し変更して次のようにします。

decimal val;
if (Decimal.TryParse(xElement.Value, out val)){
  // valid number
}
于 2011-02-07T18:58:30.570 に答える
0

次のように、XElementにどのノード値を検索するかを指示することをお勧めします。

XElement.Element("nodename").Value

XElement.Valueの代わりに。少なくともそれは私がすることです:)

于 2011-02-07T18:58:51.727 に答える