【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列挙体について詳しくは、本家マイクロソフトを参照してください。
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 続行するには何かキーを押してください . . .
コメント