外部データからParse変換にTryParseを使ってハンドリングする

今回はC#でのStringからIntやFloat型に変換するParse処理について。

システム内部の話であれば、基本的にデータ型は一致しているわけでそもそもParse処理を必要しない、もしくは(データの中身が)自明のため変換時のエラーは発生しないことが多いので安心して使える思います。

ただ、外部(サーバー経由や、エクセルからのデータ変換などの)データを受け取って処理する場合は少し面倒です。というのも、そこのデータを例えば手作業で編集しているとかだと入力ミスや予期しないデータが入ってくることもあります。そういう不確定要素が来そうなところはParseではなくTryParseを使った方が良いケースになります。

では、TryParseを使い方を見てみましょう。(例のごとく、Unityで使えるクラスになってます)

public class TryParse : MonoBehaviour 
{
    public bool isFalseCheck = false;
    public bool isOverflowCheck = false;

    private int result = -1;
    private bool isParse = false;
    private string msg = "";

    readonly private string trueInt = "12";
    readonly private string falseInt = "12a";

    private string overflowInt = "";

    void Start () {

        long overflowValue = (long)int.MaxValue + 1;
        overflowInt = overflowValue.ToString();
        Debug.Log(overflowInt);  // 2147483648

        result = int.Parse(trueInt);
        WriteConsole("Result 1");  // 12

        if (isFalseCheck) result = int.Parse(falseInt);  // FormatException 
        if (isOverflowCheck) result = int.Parse(overflowInt);  // OverflowException

        TryParseCheck(trueInt, "Result 1 True", "Result 1 false");  // True : 12
        TryParseCheck(falseInt, "Result 2 True", "Result 2 false"); // False : 0
        TryParseCheck(overflowInt, "Result 3 True", "Result 3 false"); // False : 0
    }

    void TryParseCheck(string data, string msg1, string msg2)
    {
        isParse = int.TryParse(data, out result);
        if (isParse) WriteConsole(msg1);
        else WriteConsole(msg2);
    }

    void WriteConsole(string msg)
    {
        Debug.LogFormat("{0} : {1}", msg, result);
        result = -1;
    }
}

まぁ何でこの記事を書いたかを簡単に説明すると、自分が単純にParse処理を書いてエラーしたからなんですけどね。Parse処理に失敗するとExceptionが発生するので止まりますし、エラーの理由は直ぐに予測と原因にたどり着いて修正できるんですがそれが面倒という・・・ね。

なもんで、自分用のメモとTryParseの復習って感じでした。例外処理は大事ですね!もちろん、TryParseを使わなくても別の手法で例外処理をしてもOKです。