【VB.NET】文字列から数字に変換する方法

VB.NET
この記事は約27分で読めます。

【VB.NET】文字列から数字に変換する方法

文字列から数字に変換する方法をサンプルコードを使って説明します。

必要に応じて使い分けます。

Integer.Parse を使う方法

サンプルコード

Module Module1
    Sub Main()

        ' 半角数字
        ChangeToNum("12345")

        ' 全角数字
        ChangeToNum("12345")

        ' 前後スペース
        ChangeToNum(" 12345 ")

        ' 間にスペース
        ChangeToNum("12 345")

        ' 小数点
        ChangeToNum("123.45")

        ' 符号あり
        ChangeToNum("-12345")

        ' 数字以外
        ChangeToNum("ABC")

        ' 最大値
        ChangeToNum(Integer.MaxValue.ToString)

        ' 最大値 + 1
        ChangeToNum(Integer.MaxValue + 1.ToString)

        ' 最小値
        ChangeToNum(Integer.MinValue.ToString)

        ' 最小値 - 1
        ChangeToNum(Integer.MinValue - 1.ToString)

        ' Nothing
        ChangeToNum(Nothing)

    End Sub

    Sub ChangeToNum(ByVal numSt As String)

        Console.WriteLine("【{0}】を数字に変換", numSt)
        Try

            Console.WriteLine(Integer.Parse(numSt))

        Catch ex As Exception

            Console.WriteLine(ex)

        End Try
        Console.WriteLine()

    End Sub

End Module
【12345】を数字に変換
12345

【12345】を数字に変換
System.FormatException: 入力文字列の形式が正しくありません。
   場所 System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   場所 System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
   場所 ConsoleApplication1.Module1.ChangeToNum(String numSt) 場所 C:\workProjects\ConsoleApplication1\ConsoleApplication1\Module1.vb:行 47

【 12345 】を数字に変換
12345

【12 345】を数字に変換
System.FormatException: 入力文字列の形式が正しくありません。
   場所 System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   場所 System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
   場所 ConsoleApplication1.Module1.ChangeToNum(String numSt) 場所 C:\workProjects\ConsoleApplication1\ConsoleApplication1\Module1.vb:行 47

【123.45】を数字に変換
System.FormatException: 入力文字列の形式が正しくありません。
   場所 System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   場所 System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
   場所 ConsoleApplication1.Module1.ChangeToNum(String numSt) 場所 C:\workProjects\ConsoleApplication1\ConsoleApplication1\Module1.vb:行 47

【-12345】を数字に変換
-12345

【ABC】を数字に変換
System.FormatException: 入力文字列の形式が正しくありません。
   場所 System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   場所 System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
   場所 ConsoleApplication1.Module1.ChangeToNum(String numSt) 場所 C:\workProjects\ConsoleApplication1\ConsoleApplication1\Module1.vb:行 47

【2147483647】を数字に変換
2147483647

【2147483648】を数字に変換
System.OverflowException: Int32 型の値が大きすぎるか、または小さすぎます。
   場所 System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
   場所 ConsoleApplication1.Module1.ChangeToNum(String numSt) 場所 C:\workProjects\ConsoleApplication1\ConsoleApplication1\Module1.vb:行 47

【-2147483648】を数字に変換
-2147483648

【-2147483649】を数字に変換
System.OverflowException: Int32 型の値が大きすぎるか、または小さすぎます。
   場所 System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
   場所 ConsoleApplication1.Module1.ChangeToNum(String numSt) 場所 C:\workProjects\ConsoleApplication1\ConsoleApplication1\Module1.vb:行 47

【】を数字に変換
System.ArgumentNullException: 値を Null にすることはできません。
パラメーター名:String
   場所 System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   場所 System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
   場所 ConsoleApplication1.Module1.ChangeToNum(String numSt) 場所 C:\workProjects\ConsoleApplication1\ConsoleApplication1\Module1.vb:行 47

続行するには何かキーを押してください . . .

Convert.ToUInt32 を使う方法

サンプルコード

Module Module1
    Sub Main()

        ' 半角数字
        ChangeToNum("12345")

        ' 全角数字
        ChangeToNum("12345")

        ' 前後スペース
        ChangeToNum(" 12345 ")

        ' 間にスペース
        ChangeToNum("12 345")

        ' 小数点
        ChangeToNum("123.45")

        ' 符号あり
        ChangeToNum("-12345")

        ' 数字以外
        ChangeToNum("ABC")

        ' 最大値
        ChangeToNum(Integer.MaxValue.ToString)

        ' 最大値 + 1
        ChangeToNum(Integer.MaxValue + 1.ToString)

        ' 最小値
        ChangeToNum(Integer.MinValue.ToString)

        ' 最小値 - 1
        ChangeToNum(Integer.MinValue - 1.ToString)

        ' Nothing
        ChangeToNum(Nothing)

    End Sub

    Sub ChangeToNum(ByVal numSt As String)

        Console.WriteLine("【{0}】を数字に変換", numSt)
        Try

            Console.WriteLine(Convert.ToUInt32(numSt))

        Catch ex As Exception

            Console.WriteLine(ex)

        End Try
        Console.WriteLine()

    End Sub

End Module
【12345】を数字に変換
12345

【12345】を数字に変換
System.FormatException: 入力文字列の形式が正しくありません。
   場所 System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   場所 System.Number.ParseUInt32(String value, NumberStyles options, NumberFormatInfo numfmt)
   場所 System.Convert.ToUInt32(String value)
   場所 ConsoleApplication1.Module1.ChangeToNum(String numSt) 場所 C:\workProjects\ConsoleApplication1\ConsoleApplication1\Module1.vb:行 47

【 12345 】を数字に変換
12345

【12 345】を数字に変換
System.FormatException: 入力文字列の形式が正しくありません。
   場所 System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   場所 System.Number.ParseUInt32(String value, NumberStyles options, NumberFormatInfo numfmt)
   場所 System.Convert.ToUInt32(String value)
   場所 ConsoleApplication1.Module1.ChangeToNum(String numSt) 場所 C:\workProjects\ConsoleApplication1\ConsoleApplication1\Module1.vb:行 47

【123.45】を数字に変換
System.FormatException: 入力文字列の形式が正しくありません。
   場所 System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   場所 System.Number.ParseUInt32(String value, NumberStyles options, NumberFormatInfo numfmt)
   場所 System.Convert.ToUInt32(String value)
   場所 ConsoleApplication1.Module1.ChangeToNum(String numSt) 場所 C:\workProjects\ConsoleApplication1\ConsoleApplication1\Module1.vb:行 47

【-12345】を数字に変換
System.OverflowException: UInt32 型の値が大きすぎるか、または小さすぎます。
   場所 System.Number.ParseUInt32(String value, NumberStyles options, NumberFormatInfo numfmt)
   場所 System.Convert.ToUInt32(String value)
   場所 ConsoleApplication1.Module1.ChangeToNum(String numSt) 場所 C:\workProjects\ConsoleApplication1\ConsoleApplication1\Module1.vb:行 47

【ABC】を数字に変換
System.FormatException: 入力文字列の形式が正しくありません。
   場所 System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   場所 System.Number.ParseUInt32(String value, NumberStyles options, NumberFormatInfo numfmt)
   場所 System.Convert.ToUInt32(String value)
   場所 ConsoleApplication1.Module1.ChangeToNum(String numSt) 場所 C:\workProjects\ConsoleApplication1\ConsoleApplication1\Module1.vb:行 47

【2147483647】を数字に変換
2147483647

【2147483648】を数字に変換
2147483648

【-2147483648】を数字に変換
System.OverflowException: UInt32 型の値が大きすぎるか、または小さすぎます。
   場所 System.Number.ParseUInt32(String value, NumberStyles options, NumberFormatInfo numfmt)
   場所 System.Convert.ToUInt32(String value)
   場所 ConsoleApplication1.Module1.ChangeToNum(String numSt) 場所 C:\workProjects\ConsoleApplication1\ConsoleApplication1\Module1.vb:行 47

【-2147483649】を数字に変換
System.OverflowException: UInt32 型の値が大きすぎるか、または小さすぎます。
   場所 System.Number.ParseUInt32(String value, NumberStyles options, NumberFormatInfo numfmt)
   場所 System.Convert.ToUInt32(String value)
   場所 ConsoleApplication1.Module1.ChangeToNum(String numSt) 場所 C:\workProjects\ConsoleApplication1\ConsoleApplication1\Module1.vb:行 47

【】を数字に変換
0

続行するには何かキーを押してください . . .

Integer.ParseメソッドとConvert.ToInt32の違い

簡単に説明すると、Nothing(Null)の扱いが違います。

Convert.ToInt32に Nothing を渡すと0が返って来るのに対し、Integer.Parse にNothing を渡すとArgumentNullException エラーになります。

Module Module1
    Sub Main()

        Dim numst As String = Nothing


        ' 数字変換
        Console.WriteLine(Convert.ToInt32(numst))
        '0

        ' 数字変換
        Console.WriteLine(Integer.Parse(numst))
        'ハンドルされていない例外: System.ArgumentNullException: 値を Null にすることはできません。

    End Sub

End Module

Nothing(Null)を 0 とみなすなら Convert.ToInt32 で変換するのが良いと思います。

CInt を使う方法

最大の特徴は、小数点を渡してもエラーにならないことです。

ただし、丸め処理されます。

Module Module1
    Sub Main()

        ' 半角数字
        ChangeToNum("12345")

        ' 全角数字
        ChangeToNum("12345")

        ' 前後スペース
        ChangeToNum(" 12345 ")

        ' 間にスペース
        ChangeToNum("12 345")

        ' 小数点
        ChangeToNum("123.45")

        ' 符号あり
        ChangeToNum("-12345")

        ' 数字以外
        ChangeToNum("ABC")

        ' 最大値
        ChangeToNum(Integer.MaxValue.ToString)

        ' 最大値 + 1
        ChangeToNum(Integer.MaxValue + 1.ToString)

        ' 最小値
        ChangeToNum(Integer.MinValue.ToString)

        ' 最小値 - 1
        ChangeToNum(Integer.MinValue - 1.ToString)

        ' Nothing
        ChangeToNum(Nothing)

    End Sub

    Sub ChangeToNum(ByVal numSt As String)

        Console.WriteLine("【{0}】を数字に変換", numSt)
        Try

            Console.WriteLine(CInt(numSt))

        Catch ex As Exception

            Console.WriteLine(ex)

        End Try
        Console.WriteLine()

    End Sub

End Module
【12345】を数字に変換
12345

【12345】を数字に変換
12345

【 12345 】を数字に変換
12345

【12 345】を数字に変換
System.InvalidCastException: String "12 345" から型 'Integer' への変換は無効です。 ---> System.FormatException: 入力文字列の形式が正しくありません。
   場所 Microsoft.VisualBasic.CompilerServices.Conversions.ParseDouble(String Value, NumberFormatInfo NumberFormat)
   場所 Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(String Value)
   --- 内部例外スタック トレースの終わり ---
   場所 Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(String Value)
   場所 ConsoleApplication1.Module1.ChangeToNum(String numSt) 場所 C:\workProjects\ConsoleApplication1\ConsoleApplication1\Module1.vb:行 47

【123.45】を数字に変換
123

【-12345】を数字に変換
-12345

【ABC】を数字に変換
System.InvalidCastException: String "ABC" から型 'Integer' への変換は無効です。 ---> System.FormatException: 入力文字列の形式が正しくありません。
   場所 Microsoft.VisualBasic.CompilerServices.Conversions.ParseDouble(String Value, NumberFormatInfo NumberFormat)
   場所 Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(String Value)
   --- 内部例外スタック トレースの終わり ---
   場所 Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(String Value)
   場所 ConsoleApplication1.Module1.ChangeToNum(String numSt) 場所 C:\workProjects\ConsoleApplication1\ConsoleApplication1\Module1.vb:行 47

【2147483647】を数字に変換
2147483647

【2147483648】を数字に変換
System.OverflowException: 算術演算の結果オーバーフローが発生しました。
   場所 Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(String Value)
   場所 ConsoleApplication1.Module1.ChangeToNum(String numSt) 場所 C:\workProjects\ConsoleApplication1\ConsoleApplication1\Module1.vb:行 47

【-2147483648】を数字に変換
-2147483648

【-2147483649】を数字に変換
System.OverflowException: 算術演算の結果オーバーフローが発生しました。
   場所 Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(String Value)
   場所 ConsoleApplication1.Module1.ChangeToNum(String numSt) 場所 C:\workProjects\ConsoleApplication1\ConsoleApplication1\Module1.vb:行 47

【】を数字に変換
0

続行するには何かキーを押してください . . .

 

型で扱う以上の数値はエラー

Integr型では、変換出来ない範囲の場合エラーとなります。

サンプルコード

Module Module1
    Sub Main()

        Dim num As Integer = Integer.MaxValue

        ’ギリギリセーフ
        Console.WriteLine(Integer.Parse(num.ToString))’2147483647

        ’アウト
        Console.WriteLine(Integer.Parse(num + 1.ToString))

    End Sub

End Module
2147483647

ハンドルされていない例外: System.OverflowException: Int32 型の値が大きすぎるか、または小さすぎます。
   場所 System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
   場所 ConsoleApplication1.Module1.Main() 場所 C:\workProjects\ConsoleApplication1\ConsoleApplication1\Module1.vb:行 7

もう少し大きい型で変換してあげればOK

Integr → Long に変更します。

サンプルコード

Module Module1
    Sub Main()

        Dim num As Integer = Integer.MaxValue


        ' 型の扱い範囲内
        Console.WriteLine(Integer.Parse(num.ToString)) '2147483647


        ' 型の扱い範囲外
        'Console.WriteLine(Integer.Parse(num + 1.ToString))


        ' Long.Parse で変換
        Console.WriteLine(Long.Parse(num + 1.ToString))


        ' Convert.ToInt64 で変換
        Console.WriteLine(Convert.ToInt64(num + 1.ToString))

    End Sub

End Module
2147483647
2147483648
2147483648
続行するには何かキーを押してください . . .

カンマがある文字列の場合

サンプルコード

Module Module1
    Sub Main()


        Console.WriteLine(Integer.Parse("123,456,789"))

    End Sub

End Module
ハンドルされていない例外: System.FormatException: 入力文字列の形式が正しくありません。
場所 System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
場所 System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
場所 ConsoleApplication1.Module1.Main() 場所 C:\workProjects\ConsoleApplication1\ConsoleApplication1\Module1.vb:行 5

エラー回避するサンプルコード

Imports System.Globalization

Module Module1
    Sub Main()


        Console.WriteLine(Integer.Parse("123,456,789", 
                                         NumberStyles.AllowThousands))

    End Sub

End Module
123456789
続行するには何かキーを押してください . . .

カンマ区切りがある場合、カンマを除去する処理を入れるのもひとつの手段ですが、

System.Globalization をImports して「NumberStyles列挙体を使用した変換」を使用するのが早いです。

NumberStyles列挙体は読んで字のごとく数字のスタイルの一覧です。

カンマ以外にも通貨や、-符号付きなどの文字列に対応することも出来ます。

Imports System.Globalization
Imports ExcelNumberFormat

Module Module1
    Sub Main()

        Dim value As Decimal = 12345D

        ' 通貨表記
        Dim mo = value.ToString("C2", New CultureInfo("jp-JP"))

        Console.WriteLine(mo)

        ' 通貨表記を数字に変換
        Console.WriteLine(Integer.Parse(mo, NumberStyles.Currency))

    End Sub

End Module
¥12,345.00
12345
続行するには何かキーを押してください . . .

NumberStyles列挙体について詳しくは、本家マイクロソフトを参照してください。

NumberStyles 列挙型 (System.Globalization)
整数数値型と浮動小数点数値型の Parse メソッドおよび TryParse メソッドに渡される数値文字列引数で使用できるスタイルを決定します。

Integer.TryParse を使う方法

.NET2.0以降であれば、Integer.TryParseメソッドが使えます。

Integer.TryParseは変換できない場合でもエラーとならず、変換結果に「0」を戻してくれます。

変換できない場合は、0として扱う様なシステムにはInteger.TryParse を使うのが一番楽です。

サンプルコード

Imports System.Globalization

Module Module1
    Sub Main()

        Dim stnum As String = ""
        Dim resflg As Boolean
        Dim result As Integer

        ' 変換可能か確認
        stnum = "123456"
        resflg = Integer.TryParse(stnum, result)

        Console.WriteLine(stnum)
        Console.WriteLine(resflg)
        Console.WriteLine(result)
        Console.WriteLine()


        ' 変換可能か確認
        stnum = "123,456"
        result = Integer.TryParse(stnum, result)

        Console.WriteLine(stnum)
        Console.WriteLine(resflg)
        Console.WriteLine(result)
        Console.WriteLine()


        ' カンマを取除けば変換可能か確認
        resflg = Integer.TryParse(stnum, NumberStyles.AllowThousands, Nothing, result)

        Console.WriteLine(stnum)
        Console.WriteLine(resflg)
        Console.WriteLine(result)


    End Sub

End Module
123456
True
123456

123,456
True
0

123,456
True
123456
続行するには何かキーを押してください . . .

 

コメント

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