注意:キャストに関する説明は、「ある型の値を別の型に変換(キャスト)する」に移動しました。また、書式を指定して文字列に変換する方法は、「書式を指定して数値を文字列に変換する」で説明しています。
まずは、文字列(String型)を数値(Integer、Long、Single、Double型など)に変換する基本的な方法を紹介します。
大抵の場合、Parseメソッドを使うことにより、簡単に変換できます。
'文字列をInteger型に変換 Dim i As Integer = Integer.Parse("100") '文字列をLong型に変換 Dim l As Long = Long.Parse("100") '文字列をSingle型に変換 Dim f As Single = Single.Parse("100.1") '文字列をDouble型に変換 Dim d As Double = Double.Parse("100.1") '文字列をBoolean型に変換 Dim b As Boolean = Boolean.Parse("True")
//文字列をint型に変換 int i = int.Parse("100"); //文字列をlong型に変換 long l = long.Parse("100"); //文字列をfloat型に変換 float f = float.Parse("100.1"); //文字列をdouble型に変換 double d = double.Parse("100.1"); //文字列をbool型に変換 bool b = bool.Parse("True");
変換に失敗した時は、例外がスローされます。文字列が有効な書式でない時はFormatExceptionが、オーバーフローが発生したときはOverflowExceptionがスローされます。
事前に文字列を数値に変換することができるか確かめるには、「文字列が数値に変換できるか調べる」で紹介している方法を使います。
ほとんどの場合は上記の方法で十分だとは思いますが、文字列に使用できる記号の定義やカルチャを変更して変換することもできます。そのためには、Parseメソッドの2番目のパラメータに使用できる記号の定義(スタイル)を示すNumberStyles列挙体の値と、3番目のパラメータにカルチャを示すIFormatProviderオブジェクト(通常はNumberFormatInfoまたはCultureInfoオブジェクト)を指定します(NumberStylesを指定せずにIFormatProviderのみを指定する時は、2番目のパラメータにIFormatProviderを指定します)。
NumberStyles列挙体の値を表にまとめると、以下のようになります(説明は、MSDNからの引用)。説明の欄に書かれている「NumberFormatInfo」というのは、3番目のパラメータに指定するNumberFormatInfoオブジェクト(または、CultureInfoオブジェクトのNumberFormatプロパティ)のことです。なお補足の欄には、NumberStylesを指定しなかったときに使われる値も記述しておきました。
メンバ名 | 説明 | 補足 |
---|---|---|
None | いずれのビット スタイルも許可しないことを示します。 | すべて数字の文字列。 |
AllowLeadingWhite | 解析中に先行する空白文字を無視することを示します。有効な空白文字の Unicode 値は、U+0009、U+000A、U+000B、U+000C、U+000D、および U+0020 です。 | |
AllowTrailingWhite | 解析中に後続する空白文字を無視することを示します。有効な空白文字の Unicode 値は、U+0009、U+000A、U+000B、U+000C、U+000D、および U+0020 です。 | |
AllowLeadingSign | 数値文字列に先行する符号を使用できることを示します。有効な先行する符号の文字は、 NumberFormatInfo の PositiveSign プロパティと NegativeSign プロパティによって決定します。 | |
AllowTrailingSign | 数値文字列に、後続する符号を使用できることを示します。有効な後続する符号の文字は、 NumberFormatInfo の PositiveSign プロパティと NegativeSign プロパティによって決定します。 | |
AllowParentheses | 数値文字列に、その数値を囲む 1 ペアのかっこを使用できることを示します。 | |
AllowDecimalPoint | 数値文字列に小数点を使用できることを示します。有効な小数点の文字は、 NumberFormatInfo の NumberDecimalSeparator プロパティと CurrencyDecimalSeparator プロパティによって決定します。 | |
AllowThousands | 数値文字列に、たとえば 100 の桁と 1000 の桁を区切るグループ区切り文字を使用できることを示します。有効なグループ区切り文字は、 NumberFormatInfo の NumberGroupSeparator プロパティと CurrencyGroupSeparator プロパティによって決定します。各グループの桁数は、 NumberFormatInfo の NumberGroupSizes プロパティと CurrencyGroupSizes プロパティによって決定します。 | Double、Single.Parseのデフォルトで使用される。 |
AllowExponent | 数値文字列に指数表記を使用できることを示します。 | |
AllowCurrencySymbol | 数値文字列に通貨記号が含まれている場合に通貨として解析することを示します。それ以外の場合は数値として解析されます。有効な通貨記号は、 NumberFormatInfo の CurrencySymbol プロパティによって決定します。 | |
AllowHexSpecifier | 数値文字列が 16 進数値を表すことを示します。有効な 16 進数値には、0-9 の数字と A-F および a-f の 16 進数の数字を使用できます。16 進数値には、左側にゼロを埋め込むことができます。このスタイルを使用して解析する文字列に、"0x" のプリフィックスを付けることはできません。 | |
Integer | AllowLeadingWhite、AllowTrailingWhite、AllowLeadingSign の各スタイルを使用することを示します。これは複合数値スタイルです。 | Byte、UInt16、UInt32、UInt64、SByte、Int64、Int32、Int16.Parseのデフォルトで使用される。 |
HexNumber | AllowLeadingWhite、AllowTrailingWhite、AllowHexSpecifier の各スタイルを使用することを示します。これは複合数値スタイルです。 | |
Number | AllowLeadingWhite、AllowTrailingWhite、AllowLeadingSign、AllowTrailingSign、AllowDecimalPoint、および AllowThousands の各スタイルを使用することを示します。これは複合数値スタイルです。 | Decimal.Parseのデフォルトで使用される。 |
Float | AllowLeadingWhite、AllowTrailingWhite、AllowLeadingSign、AllowDecimalPoint、AllowExponent の各スタイルを使用することを示します。これは複合数値スタイルです。 | Double、Single.Parseのデフォルトで使用される。 |
Currency | AllowExponent と AllowHexSpecifier を除くすべてのスタイルを使用することを示します。これは複合数値スタイルです。 | 指数表記と16進数以外のすべての数字。 |
Any | AllowHexSpecifier を除くすべてのスタイルを使用することを示します。これは複合数値スタイルです。 | 16進数以外のすべての数字。 |
カルチャは、デフォルトでは、現在のカルチャが使われます。
以下にスタイルとカルチャを変更して文字列をDouble値に変換する例を示します。
Dim str As String = "$100" 'en-US のCultureInfoオブジェクトを作成 Dim ci As New System.Globalization.CultureInfo("en-US") 'スタイルとカルチャを変更して変換する Dim d As Double = Double.Parse(str, System.Globalization.NumberStyles.Any, ci)
string str = "$100"; //en-US のCultureInfoオブジェクトを作成 System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("en-US"); //スタイルとカルチャを変更して変換する double d = double.Parse(str, System.Globalization.NumberStyles.Any, ci);
数値を文字列に変換するには、ToStringメソッドを使用します。
Dim s As String 'Integer型を文字列に変換 Dim i As Integer = 100 s = i.ToString() 'Long型を文字列に変換 Dim l As Long = 100L s = l.ToString() 'Single型を文字列に変換 Dim f As Single = 100.1F s = f.ToString() 'Double型を文字列に変換 Dim d As Double = 100.1 s = d.ToString() 'Boolean型を文字列に変換 'sは"True"となる Dim b As Boolean = True s = b.ToString()
string s; //int型を文字列に変換 int i = 100; s = i.ToString(); //long型を文字列に変換 long l = 100L; s = l.ToString(); //float型を文字列に変換 float f = 100.1F; s = f.ToString(); //double型を文字列に変換 double d = 100.1; s = d.ToString(); //bool型を文字列に変換 //sは"True"となる bool b = true; s = b.ToString();
ToStringメソッドは、書式を指定して文字列に変換することもできます。その方法は、「書式を指定して数値を文字列に変換する」で説明しています。
全般的なデータ型の変換には、Convertクラスを使っても行えます。次にConvertクラスを使った簡単な変換例を示します。
Dim s As String Dim i As Integer = 100 'Integer型を文字列に変換 s = Convert.ToString(i) '文字列をInteger型に変換 i = Convert.ToInt32(s) Dim d As Double = 1.23 'Double型を文字列に変換 s = Convert.ToString(d) '文字列をDouble型に変換 d = Convert.ToDouble(s) Dim m As Decimal = 100 'Decimal型を文字列に変換 s = Convert.ToString(m) '文字列をDecimal型に変換 m = Convert.ToDecimal(s)
string s; int i = 100; //int型を文字列に変換 s = Convert.ToString(i); //文字列をint型に変換 i = Convert.ToInt32(s); double d = 1.23; //double型を文字列に変換 s = Convert.ToString(d); //文字列をdouble型に変換 d = Convert.ToDouble(s); decimal m = 100; //decimal型を文字列に変換 s = Convert.ToString(m); //文字列をdecimal型に変換 m = Convert.ToDecimal(s);
VB.NETでは、CStr関数やCInt関数などのデータ型変換関数を使うことで、文字列と数値の変換を行うことができます。VB.NETでは、これらの関数を使うと、パフォーマンスが向上することがあります。
また、Val関数で文字列を数値に、Str関数やFormat関数で数値を文字列に変換することもできます。
これらの関数について詳しくは、MSDNの「データ型変換関数」や「変換関数 (Visual Basic)」をご覧ください。
Dim s As String Dim i As Integer = 100 'Integer型を文字列に変換 s = CStr(i) '文字列をInteger型に変換 i = CInt(s)
また、CType関数を使っても同様の変換ができます。
Dim s As String Dim i As Integer = 100 'Integer型を文字列に変換 s = CType(i, String) '文字列をInteger型に変換 i = CType(s, Integer)
VB.NETでは、Option StrictステートメントがOffのとき、これらのメソッドや関数を全く使わないで、暗黙的に変換を行うこともできます。ただしこのような方法はお勧めできません。
オブジェクトのParseまたはToStringメソッドを使って変換する方法と、Convertクラスの静的メソッドを使って変換する方法の一番の違いは、null(VB.NETではNothing)を変換できるか、できないかです。まずは次の例をご覧ください。
Dim str As String = Nothing 'Convert.ToInt32メソッドを使う '結果は、0となる Dim i1 As Integer = Convert.ToInt32(str) 'int.Parseメソッドを使う 'ArgumentNullExceptionがスローされる Dim i2 As Integer = Integer.Parse(str)
string str = null; //Convert.ToInt32メソッドを使う //結果は、0となる int i1 = Convert.ToInt32(str); //int.Parseメソッドを使う //ArgumentNullExceptionがスローされる int i2 = int.Parse(str);
このようにnull(VB.NETではNothing)をConvert.ToInt32メソッドに渡してもエラーとならずに0を返しますが、int.Parseメソッドにnullを渡すと例外ArgumentNullExceptionがスローされて失敗します。
nullを文字列に変換する例も見てみましょう。
Dim obj As Object = Nothing 'Convert.ToStringメソッドを使う '結果は、空の文字列となる Dim str1 As String = Convert.ToString(obj) 'Object.ToStringメソッドを使う 'NullReferenceExceptionがスローされる Dim str2 As String = obj.ToString()
object obj = null; //Convert.ToStringメソッドを使う //結果は、空の文字列となる string str1 = Convert.ToString(obj); //Object.ToStringメソッドを使う //NullReferenceExceptionがスローされる string str2 = obj.ToString();
Convert.ToStringメソッドはnullを渡してもエラーを出さずに空の文字列を返します。Object.ToStringメソッドの場合は言うまでも無く、エラーが発生します。
このように、nullを変換しようとしてもエラーが出ないようにしたいのであれば、Convertクラスのメソッドを使うのが良いでしょう。
補足:VB.NETでデータ型変換関数を使ってNothingを変換したときもConvertと同じように、例外をスローしないようです。
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。