忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

文字列から数値型への変換(Parse , TryParse)

文字列から数値型への変換はいろんな所で必要になりますが、例えばデータベースからのデータの取得で 結果を文字列にして読込んだ場合、これを数値にする場合などです。

数値変換には各データ型の Parse メソッドを利用して可能です。以下に例として Integer型 の変換関数を示します。

文字列からInteger型への変換

    ''' 
    ''' 文字列からInteger型にデータ変換
    ''' 
    ''' <param name="strVal">元の文字列</param>
    ''' 変換後データ
    Function StringToInt(ByVal strVal As String) As Integer
        Try
            Return Integer.Parse(strVal)

            '「Convert」クラスの関数を利用しても同じです
            'Return Convert.ToInt32(strVal)

        Catch ex As Exception
            '例外発生の場合、「0」で返す
            Return 0
        End Try
    End Function

Parse メソッドでの例外が発生した場合には全て0で返す様にしています。 データベースからのデータ取得で文字列から数値に変換する場合、ほとんど例外エラーは発生しないのでこの様にしています。 データベースの数値カラムからのデータで数値以外はあり得ないと思いますので。

但し、この関数ですが以下の様な使い方をすると非常に時間が掛かる様です。 (私のPC上では10秒以上の時間が掛かりました。)

文字列から数値型への変換の実行例1

    Private Sub StrToInt_Click(sender As Object, e As EventArgs) Handles StrToInt.Click
        '変換が問題無い例
        Dim strValue As String = "123456789"
        Dim intValue As Integer = 0
        intValue = StringToInt(strValue)
        MsgBox("Integer変換:" & intValue.ToString)

        '時間計測を「Stopwatch」クラスで行う
        Dim stopwatch As New Stopwatch()
        stopwatch.Start()

        strValue = "ABCD"
        For i As Integer = 1 To 1000
            '関数内でExceptionが発生するはず
            intValue = StringToInt(strValue)
        Next
        stopwatch.Stop()

        Dim str As String = ""
        str &= String.Format("ミリ秒単位の経過時間の合計 = {0}", stopwatch.ElapsedMilliseconds)
        MsgBox(str)
    End Sub

VB.NETの Exception 処理は非常に時間が掛かる処理の様で、今回の様な関数の呼び出しを多く行う場合には注意が必要です。 対策としては Exception 処理をなるべくさせないか、その他の方法を取る必要があります。

今回の対策としては Parse メソッドを TryParse メソッドに変更しています。

文字列からInteger型への変換・TryParse

    ''' 
    ''' 文字列からInteger型にデータ変換その2
    ''' 
    ''' <param name="strVal">元の文字列</param>
    ''' 変換後データ
    Function StringToInt2(ByVal strVal As String) As Integer
        Try
            Dim intVal As Integer
            'TryParseでInteger型に変換
            Dim result As Boolean = Int32.TryParse(strVal, intVal)

            'ParseでInteger型に変換
            Return intVal

        Catch ex As Exception
            '例外発生の場合、「0」で返す
            Return 0
        End Try
    End Function

TryParse メソッドは変換結果を第2引数に返し、戻り値は True を返します。 尚、失敗した場合は第2引数に0を返し、戻り値は False を返します。

先ほどの使用例をこの関数を使う様に変更すれば、処理時間は格段に向上します。
とにかくネストが深い処理等で処理時間が異常に長い場合には、Exception 処理が絡んでいないかを疑ってみては如何でしょうか。

文字列から数値型への変換の実行例2

    Private Sub StrToInt_Click(sender As Object, e As EventArgs) Handles StrToInt.Click
        '時間計測を「Stopwatch」クラスで行う
        Dim stopwatch As New Stopwatch()
        stopwatch.Start()

        strValue = "ABCD"
        For i As Integer = 1 To 1000
            '呼び出し関数を変更
            intValue = StringToInt2(strValue)
        Next
        stopwatch.Stop()

        Dim str As String = ""
        str &= String.Format("ミリ秒単位の経過時間の合計 = {0}", stopwatch.ElapsedMilliseconds)
        MsgBox(str)
    End Sub

関連する記事

オブジェクト型から数値型への変換(TryParse)
文字列定数(改行、タブ、バックスペース等)について
文字列変換関数(StrConv)で変換が途中で切れる
文字列変換関数(StrConv)の使い方












PR

コメント

コメントを書く