数値型が提供するParseメソッドや、Convertクラスなどを利用して、文字列を数値に変換する方法を説明する。
本稿は2003/03/27に初版公開、2008/07/17に改訂した記事を再改訂し、Visual Studio 2017でコードの動作検証、2進数/8進数/16進数に変換する方法の追加、図版の追加、全般的な構成の変更などを行ったものです。
テキストボックスなどでユーザーが入力した文字列を数値に変換するには、各数値型で実装されているParseメソッドを使用する。
特定のトピックをすぐに知りたいという方は以下のリンクを活用してほしい。
例えば、文字列をint型(Int32型と同等。VBではInteger型)の数値に変換するには、以下のように記述する(「int.Parse」「Integer.Parse」は「Int32.Parse」と記述してもよい)。
string str = "123456789";
int num = int.Parse(str);
Dim str As String = "123456789"
Dim num As Integer = Integer.Parse(str)
次にParseメソッドを使用した、コンパイルして実行可能なサンプルプログラムを示す。Visual Studio 2017でVBプロジェクトを新規作成して試す場合には、Mainプロシージャ内のコードをコピー&ペーストしてほしい(以下、同様)。
// atoi1.cs
using System;
class ATOI1 {
public static void Main() {
string str = "123456789";
int num = int.Parse(str);
Console.WriteLine(num);
// 出力:123456789
//str = "1234567890987654321";
//num = int.Parse(str);
//
//例外:System.OverflowExceptionが発生
//str = "1,234,567,890";
//num = int.Parse(str);
//
//例外:System.FormatExceptionが発生
}
}
// コンパイル方法:csc atoi1.cs
' atoi1.vb
Imports System
Class ATOI1
Public Shared Sub Main()
Dim str As String = "123456789"
Dim num As Integer = Integer.Parse(str)
Console.WriteLine(num)
' 出力:123456789
'str = "1234567890987654321"
'num = Integer.Parse(str)
'
'例外:System.OverflowExceptionが発生
'str = "1,234,567,890"
'num = Integer.Parse(str)
'
'例外:System.FormatExceptionが発生
End Sub
End Class
' コンパイル方法:vbc atoi1.vb
サンプルプログラム内のコメントでも示しているように、変換しようとする文字列が、変換する数値の最大値を超えている場合(int型の最大値は2,147,483,647)や、数値以外の文字を含んでいる場合には例外が発生する。
ただしParseメソッドでは、文字列とNumberStyles列挙体(System.Globalization名前空間)の値の2つをパラメーターにとるメソッドのバージョンを利用することにより、NumberStyles列挙体で指定したスタイルの文字列を数値に変換できる。
string str = "123,456,789";
int num = int.Parse(str, NumberStyles.AllowThousands);
Dim str As String = "123,456,789"
Dim num As Integer = int.Parse(str, NumberStyles.AllowThousands)
上の例では、数値の桁区切り記号(日本語の環境ではカンマ)が文字列に含まれている場合でも、正しく数値に変換できる。このバージョンのParseメソッドを利用したサンプルプログラムを次に示す。
// atoi2.cs
using System;
using System.Globalization;
class ATOI2 {
public static void Main() {
string str = "123,456,789";
int num = int.Parse(str, NumberStyles.AllowThousands);
Console.WriteLine(num);
// 出力:123456789
str = "123e4";
num = int.Parse(str, NumberStyles.AllowExponent);
Console.WriteLine(num);
// 出力:1230000
}
}
// コンパイル方法:csc atoi2.cs
' atoi2.vb
Imports System
Imports System.Globalization
Class ATOI2
Public Shared Sub Main()
Dim str As String = "123,456,789"
Dim num As Integer = Integer.Parse(str, NumberStyles.AllowThousands)
Console.WriteLine(num)
' 出力:123456789
str = "123e4"
num = Integer.Parse(str, NumberStyles.AllowExponent)
Console.WriteLine(num)
' 出力:1230000
End Sub
End Class
' コンパイル方法:vbc atoi2.vb
NumberStyles列挙体では、通貨記号や桁区切り記号、小数点記号などを示すスタイル(および複数のスタイルを組み合わせたスタイル)が定義されている。ただし、実際に使用されるこれらの記号は、コードを実行する環境によって異なる。
上記のサンプルプログラムは、日本や韓国のWindows環境では実行できるが、例えば、桁区切り記号としてピリオドを使用するドイツの環境ではSystem.FormatException例外が発生するはずだ。これらの記号の設定は、例えばWindows 10であれば、コントロールパネルの[時計と地域]にある[日付、時刻、または数値の形式の変更]をクリックして[地域]ダイアログを表示し、そこから[追加の設定]ボタンをクリックすると表示される[形式のカスタマイズ]ダイアログで変更できる。
[地域と言語のオプション]の[地域オプション]タブ
[数値]タブでは小数点の記号などを、[通貨]タブでは通貨記号などを設定できる。
基本的なデータ型の変換は、Convertクラス(System名前空間)のメソッドを利用しても可能だ。例えば、文字列をInt32型の数値に変換するには以下のように記述する。
string str = "123456789";
int num = Convert.ToInt32(str);
Dim str As String = "123456789"
Dim num As Integer = Convert.ToInt32(str)
Convertクラスを利用した実行可能なサンプルプログラムを次に示す。
// atoi3.cs
using System;
class ATOI3 {
public static void Main() {
string str = "123456789";
int num = Convert.ToInt32(str);
Console.WriteLine(num);
// 出力:123456789
str = Convert.ToString(num);
Console.WriteLine(str);
// 出力:123456789
//str = "1,234,567,890";
//num = Convert.ToInt32(str);
//
//例外:System.FormatExceptionが発生
}
}
// コンパイル方法:csc atoi3.cs
' atoi3.vb
Imports System
Class ATOI3
Public Shared Sub Main()
Dim str As String = "123456789"
Dim num As Integer = Convert.ToInt32(str)
Console.WriteLine(num)
' 出力:123456789
str = Convert.ToString(num)
Console.WriteLine(str)
' 出力:123456789
'str = "1,234,567,890"
'num = Convert.ToInt32(str)
'
'例外:System.FormatExceptionが発生
End Sub
End Class
' コンパイル方法:vbc atoi3.vb
Convertクラスが変換をサポートする型には次のようなものがある。各メソッドについては、オーバーライドにより、ほとんどの基本的なデータ型をパラメーターとして受け取ることができる。
メソッド | 変換後の値 |
---|---|
ToBoolean | ブール値 |
ToByte | 8ビット符号なし整数 |
ToChar | Unicode文字 |
ToDateTime | DateTime型の日時 |
ToDecimal | Decimal型(10進数)の数値 |
ToDouble | 倍精度浮動小数点数 |
ToInt16 | 16ビット符号付き整数 |
ToInt32 | 32ビット符号付き整数 |
ToInt64 | 64ビット符号付き整数 |
ToSByte | 8ビット符号付き整数 |
ToSingle | 単精度浮動小数点数 |
ToString | 文字列 |
ToUInt16 | 16ビット符号なし整数 |
ToUInt32 | 32ビット符号なし整数 |
ToUInt64 | 64ビット符号なし整数 |
Convertクラスのメソッドとその戻り値の型 |
このように、Convertクラスはデータ型を変換するメソッドばかりを集めたクラスだ。ただし、マイクロソフトが提供するドキュメントにも記されているように、例えば、Convert.ToInt32メソッドはその内部でInt32.Parseメソッドを呼び出している。
ParseメソッドとNumberStyles列挙体(System.Globalization名前空間)を使うと、16進数の文字列を変換できる(次のコード。C#では「using System.Globalization;」が、VBでは「Imports System.Globalization」が必要)。
int num = int.Parse("1e240", NumberStyles.HexNumber);
Console.WriteLine(num);
// 出力:123456
Dim num As Integer = Integer.Parse("1e240", NumberStyles.HexNumber)
Console.WriteLine(num)
' 出力:123456
ConvertクラスのToInt32メソッドでは、第2引数に基数を与えることで、2進数/8進数/16進数の文字列を変換できる(次のコード)。
Console.WriteLine(Convert.ToInt32("11", 2)); // 2進数として解釈
// 出力:3
Console.WriteLine(Convert.ToInt32("11", 8)); // 8進数として解釈
// 出力:9
Console.WriteLine(Convert.ToInt32("1a", 16)); // 16進数として解釈
// 出力:26
Console.WriteLine(Convert.ToInt32("11", 2)) ' 2進数として解釈
' 出力:3
Console.WriteLine(Convert.ToInt32("11", 8)) ' 8進数として解釈
' 出力:9
Console.WriteLine(Convert.ToInt32("1a", 16)) ' 16進数として解釈
' 出力:26
なお.NET Framework 2.0以降では、Int32型などにTryParseメソッドが新しく追加されており、このメソッドを使えば、失敗しても例外を発生させずに、文字列を数値に変換できる。このメソッドについては、「文字列を数値に変換するには?(TryParse編)」で解説している。
カテゴリ:クラスライブラリ 処理対象:文字列
使用ライブラリ:Int32構造体(System名前空間)
使用ライブラリ:NumberStyles列挙体(System.Globalization名前空間)
使用ライブラリ:Convertクラス(System名前空間)
関連TIPS:文字列を数値に変換するには?(TryParse編)
関連TIPS:文字列をシフトJISとしてバイト列に変換するには? - C#
関連TIPS:日付や時刻の文字列をDateTime/DateTimeOffsetオブジェクトに変換するには?
関連TIPS:2進数文字列と16進数文字列を相互に変換するには?
関連TIPS:数値←→3〜36進数文字列を相互に変換するには?[C#、VB]
【2018/10/03】Visual Studio 2017でコードの動作検証、2進数/8進数/16進数に変換する方法の追加、図版の追加、全般的な構成の変更などを行いました。
【2008/07/17】VB(Visual Basic)のコード例とサンプルプログラムを追加しました。
【2003/03/27】初版公開。
Copyright© Digital Advantage Corp. All Rights Reserved.