4

値を変換するためにParseを使用する1.1ビルドシステムがあります(現在は3.5です)。

string myString = String.Empty;
double myValue = double.Parse(myString);

FormatExceptionをスローします(私は0.0を期待していました)。

2.0以降を使用して書き直した場合

string myString = String.Empty;
double myValue;
if (double.TryParse(myString, out myValue))
    //do something

必要な0.0を取得しましたが、残念ながら、(elseツリーで)意味のあるエラーメッセージを取得する可能性がありません。

なぜParseにエラーが発生し、TryParseに期待値が表示されるのですか?TryParseからエラーメッセージを取得する方法はありますか(時間は問題ではありません)?

私はそれをそのように回避したくありません:

  • if...thenを使用してエラーを回避します

    myValue = myString.Length == 0 ? 0.0 : double.Parse(myString);
    
  • エラーが発生した場合の2回の呼び出し

    if (!double.TryParse(myString, out myValue))
        myValue = double.Parse(myString);
    
4

7 に答える 7

8

Parse文字列を解析できない場合は例外をスローし、をTryParse返しますbool。このブール値(解析が成功した場合はtrue、それ以外の場合はfalse)を処理して、表示する成功/エラーメッセージを表示できます。

myValueはパラメータであるためout、メソッドで設定する必要があります。文字列を解析できない場合、TryParseはそれを0.0に設定します。これが、TryParseメソッドを使用するときにその数値を取得する理由です。

于 2012-12-19T13:31:42.547 に答える
2

TryParseを使用すると、例外をスローせずに変換でき、成功した場合はtrueを返します。あなたが取る行動はあなた次第です

if (!double.TryParse(myString, out myValue))
{
//throw exception here
}

入力が常に数字になるかどうかわからない場合に便利です

于 2012-12-19T13:32:32.970 に答える
2

いいえ、正確なエラーメッセージを取得することはできません。doubleに変換できるかどうかと、可能であれば結果知りたいだけです。変換が失敗する正確な理由はあなたにはわかりません。

于 2012-12-19T13:31:34.940 に答える
1

なぜParseにエラーが発生し、TryParseに期待値が表示されるのですか?

それがインターフェースの設計方法だからです。TryParse入力の形式が無効な場合でも例外はスローされません。代わりに。を返しますfalse

TryParseからエラーメッセージを取得する方法はありますか(時間は問題ではありません)?

いいえ。ただし、独自のエラーメッセージを作成できます。

if (double.TryParse(myString, out myValue))
{
    //do something
}
else
{
    throw new FooException("Problem!");
}

ただし、エラーが発生したときに例外をスローする場合は、を使用する方が簡単Parseです。

于 2012-12-19T13:31:17.397 に答える
0

TryParseどういうわけかこのように実装されています:

try
{
    Parse(...);
    return true;
}
catch
{
    return false;
}

したがって、同じ方法でそれを行うことができます。

try
{
    double.Parse(str, out dbl);
}
catch (Exception ex)
{
    // Do something with ex.Message
    dbl = 0.0;
}

// Continue with dbl.
于 2012-12-19T13:34:57.070 に答える
0

解析が失敗した理由double.TryParseは(設計上)わかりませんので、忘れてください。古い方法でそれを行う:

string myString = String.Empty;
double myValue = 0.0;

try
{
    myValue = double.Parse(myString);
}
catch (FormatException)
{
    // Now you have a meaningful story here!
}
于 2012-12-19T13:35:27.967 に答える
0

Outパラメータを設定する必要があるため、TryParseが失敗すると、出力がデフォルトに初期化されてから戻りますが、「else」ループでは...失敗したことを意味します。

以下のコードを実行してみてください。これは、TryParseが実際に値を上書きしていることを示していますが、解析が失敗したことを示しています...

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                ParseAndOutput("");
                ParseAndOutput("1.0");
                ParseAndOutput("ABC");
            }

            private static void ParseAndOutput(string input)
            {
                double value = -1;
                if (double.TryParse(input, out value))
                {
                    Console.WriteLine("Parse succeeded for '"+input+"', try parse changed to: " + value);
                }
                else
                {
                    Console.WriteLine("Parse failed for '" + input + "', try parse changed to:  " + value);
                }
            }
        }
    }

したがって、ParseとTryParseはどちらもstring.Emptyで失敗します。空の場合、失敗が異なる方法で報告されます。これがTryParseの要点であり、例外をスローすることを意図したものではありません...

于 2012-12-19T13:48:02.893 に答える