DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

文字列を数値に変換する、数値を文字列に変換する

注意:キャストに関する説明は、「ある型の値を別の型に変換(キャスト)する」に移動しました。また、書式を指定して文字列に変換する方法は、「書式を指定して数値を文字列に変換する」で説明しています。

Parseメソッドを使って、文字列を数値に変換する

まずは、文字列(String型)を数値(Integer、Long、Single、Double型など)に変換する基本的な方法を紹介します。

大抵の場合、Parseメソッドを使うことにより、簡単に変換できます。

VB.NET
コードを隠すコードを選択
'文字列を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")
C#
コードを隠すコードを選択
//文字列を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値に変換する例を示します。

VB.NET
コードを隠すコードを選択
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)
C#
コードを隠すコードを選択
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メソッドを使用します。

VB.NET
コードを隠すコードを選択
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()
C#
コードを隠すコードを選択
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クラスを使っても行えます。次にConvertクラスを使った簡単な変換例を示します。

VB.NET
コードを隠すコードを選択
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)
C#
コードを隠すコードを選択
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のデータ型変換関数による変換

VB.NETでは、CStr関数やCInt関数などのデータ型変換関数を使うことで、文字列と数値の変換を行うことができます。VB.NETでは、これらの関数を使うと、パフォーマンスが向上することがあります。

また、Val関数で文字列を数値に、Str関数やFormat関数で数値を文字列に変換することもできます。

これらの関数について詳しくは、MSDNの「データ型変換関数」や「変換関数 (Visual Basic)」をご覧ください。

VB.NET
コードを隠すコードを選択
Dim s As String
Dim i As Integer = 100

'Integer型を文字列に変換
s = CStr(i)

'文字列をInteger型に変換
i = CInt(s)

また、CType関数を使っても同様の変換ができます。

VB.NET
コードを隠すコードを選択
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クラスの違い

オブジェクトのParseまたはToStringメソッドを使って変換する方法と、Convertクラスの静的メソッドを使って変換する方法の一番の違いは、null(VB.NETではNothing)を変換できるか、できないかです。まずは次の例をご覧ください。

VB.NET
コードを隠すコードを選択
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)
C#
コードを隠すコードを選択
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を文字列に変換する例も見てみましょう。

VB.NET
コードを隠すコードを選択
Dim obj As Object = Nothing

'Convert.ToStringメソッドを使う
'結果は、空の文字列となる
Dim str1 As String = Convert.ToString(obj)

'Object.ToStringメソッドを使う
'NullReferenceExceptionがスローされる
Dim str2 As String = obj.ToString()
C#
コードを隠すコードを選択
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と同じように、例外をスローしないようです。
  • 履歴:
  • 2008/7/10 「Parse、ToStringメソッドとConvertクラスの違い」を追加。
  • 2008/7/26 キャストに関する説明を「ある型の値を別の型に変換(キャスト)する」に移動。
  • 2011/7/10 「Parseメソッドを使って、文字列を数値に変換する」に「使用できる記号(スタイル)や、カルチャを変更する」を追記。