C#

ParseとTryParseで変換できない文字列を使用してみる

ParseとTryParse

.NET Frameworkには、文字列を数値など別の型のデータに変換するためのメソッド(Parse、TryParse)があります。
この2つのメソッドは、「文字列をある型のデータに変換する」ことが目的です。
実装方法や動作に多少の違いがあります。
C#のint型の場合(int.Parseint.TryParse)

それぞれ、下記のように宣言されています。

// int.Parse
public static int Parse( string s )
// int.TryParse
public static bool TryParse( string s, out int result )

この2つのメソッドは、文字列(string s)の中身が、「int型に変換できない文字列」だったときに動作が大きく異なります。

代表的な「変換できない文字列」として、空文字列(“”)だった場合で、変換処理を行ってみます。

int.Parseで文字列を数値に変換する

このようなコードを実装しました。

private void btnTest_Click(object sender, EventArgs e)
{
    // [Test]ボタンを押したときの処理
    string s = txtData.Text;    // テキストボックスから文字列を取得する
    int data = -1;              // 変換後の数値を格納する変数
    data = int.Parse(s);
}

ここで、txtData.Textが空文字列(“”)だった場合、例外が発生します。

Perseのときの例外

発生する例外は、’FormatException’(入力文字列の形式が正しくありません)というものです。

 

int.Parseで例外処理を追加する

では、int.Parseで例外が発生した場合のための「例外処理」を実装してみます。

private void btnTest_Click(object sender, EventArgs e)
{
    // [Test]ボタンを押したときの処理
    string s = txtData.Text;    // テキストボックスから文字列を取得する
    int data = -1;              // 変換後の数値を格納する変数
    try
    {
        data = int.Parse(s);
    }
    catch (FormatException exception)
    {
        // 例外発生
        MessageBox.Show(string.Format("変換中に例外が発生しました。rn"{0}"", exception.Message));
        return;
    }
}

こうすれば、変換できない文字列でも例外は表示されませんが、例外そのものは発生しています

 

int.TryParseに置き換えてみる

先ほどのコードを、int.TryParseの呼び出しに置き換えてみました。

private void btnTest_Click(object sender, EventArgs e)
{
    // [Test]ボタンを押したときの処理
    string s = txtData.Text;    // テキストボックスから文字列を取得する
    int data = -1;              // 変換後の数値を格納する変数
    int.TryParse(s, out data);
}

この場合、変数 s が空文字列(“”)でも例外は発生しません。

そして、このときの変数 data の値は0(ゼロ)でした。

ですが、このままではtxtData.Textで入力したものが「0という数値を入力した」のか、「空文字列で変換した結果、0になってしまった」のかの判別ができません。

int.TryParseは戻り値がbool型で、

  • trueの場合、変換に成功した。
  • falseの場合、変換に失敗した。

という識別が可能です。

コードでは、変数’data’をint.TryParseにそのまま渡していました。

これでは、変換に失敗した場合、int.TryParseでの変換前の変数’data’の値が判らなくなります。
(変換に失敗した場合は、元の値に戻す必要があるときに、値を元の値に戻すことができなくなってしまいます)

 

int.TryParseを使った最終的なコード

最終的なコードはこのようになります。

private void btnTest_Click(object sender, EventArgs e)
{
    // [Test]ボタンを押したときの処理
    string s = txtData.Text;    // テキストボックスから文字列を取得する
    int data = -1;              // 変換後の数値を格納する変数

    int temp = -1;              // 変換のための一時的な変数
    if (!int.TryParse(s, out temp))
    {
        // 変換できなかった
        MessageBox.Show(string.Format("変換できない文字列でした。rn文字列:"{0}"", s);
        return;
    }
    // 変換に成功したので値を更新します
    data = temp;
}

 

結果

int.Parseは、変換元の文字列が「確実にint型に変換できること」を前提にしないと、例外が発生する可能性がある

int.TryParseは、変換に失敗した場合の処理を実装しておく必要がある。

ということになります。

タイトルとURLをコピーしました