連載
» 2018年10月03日 05時00分 公開

.NET TIPS:文字列を数値に変換するには?[C#/VB]

数値型が提供するParseメソッドや、Convertクラスなどを利用して、文字列を数値に変換する方法を説明する。

[遠藤孝信, 山本康彦,共著]
「.NET TIPS」のインデックス

連載「.NET TIPS」

本稿は2003/03/27に初版公開、2008/07/17に改訂した記事を再改訂し、Visual Studio 2017でコードの動作検証、2進数/8進数/16進数に変換する方法の追加、図版の追加、全般的な構成の変更などを行ったものです。


 テキストボックスなどでユーザーが入力した文字列を数値に変換するには、各数値型で実装されているParseメソッドを使用する。

POINT 文字列を数値に変換する方法

文字列を数値に変換する方法 文字列を数値に変換する方法


 特定のトピックをすぐに知りたいという方は以下のリンクを活用してほしい。

文字列を数値に変換する基本

 例えば、文字列を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メソッドの使用例(上:C#、下:VB)

 次に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)や、数値以外の文字を含んでいる場合には例外が発生する。

NumberStyles列挙体を使用した変換

 ただし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)

指定したスタイルを持つ文字列の変換(上:C#、下:VB)

 上の例では、数値の桁区切り記号(日本語の環境ではカンマ)が文字列に含まれている場合でも、正しく数値に変換できる。このバージョンの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

スタイルを指定した文字列を数値に変換するサンプルプログラム
C#版サンプルプログラムのダウンロード
VB版サンプルプログラムのダウンロード

 NumberStyles列挙体では、通貨記号や桁区切り記号、小数点記号などを示すスタイル(および複数のスタイルを組み合わせたスタイル)が定義されている。ただし、実際に使用されるこれらの記号は、コードを実行する環境によって異なる。

 上記のサンプルプログラムは、日本や韓国のWindows環境では実行できるが、例えば、桁区切り記号としてピリオドを使用するドイツの環境ではSystem.FormatException例外が発生するはずだ。これらの記号の設定は、例えばWindows 10であれば、コントロールパネルの[時計と地域]にある[日付、時刻、または数値の形式の変更]をクリックして[地域]ダイアログを表示し、そこから[追加の設定]ボタンをクリックすると表示される[形式のカスタマイズ]ダイアログで変更できる。

[地域]ダイアログの[追加の設定]ボタンをクリック
[地域]ダイアログの[追加の設定]ボタンをクリック
[数値]タブでは小数点の記号などを、[通貨]タブでは通貨記号などを設定できる
[数値]タブでは小数点の記号などを、[通貨]タブでは通貨記号などを設定できる

[地域と言語のオプション]の[地域オプション]タブ
[数値]タブでは小数点の記号などを、[通貨]タブでは通貨記号などを設定できる。


Convertクラスによる変換

 基本的なデータ型の変換は、Convertクラス(System名前空間)のメソッドを利用しても可能だ。例えば、文字列をInt32型の数値に変換するには以下のように記述する。

string str = "123456789";
int num = Convert.ToInt32(str);

Dim str As String = "123456789"
Dim num As Integer = Convert.ToInt32(str)

Convertクラスの使用例(上:C#、下:VB)

 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クラスにより文字列を数値に型変換するサンプルプログラム
C#版サンプルプログラムのダウンロード
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メソッドを呼び出している。

2進数/8進数/16進数の変換

 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

16進数の文字列の変換(上:C#、下:VB)

 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

2進数/8進数/16進数の文字列の変換(上:C#、下:VB)

例外が出ない変換[.NET 2.0]

 なお.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】初版公開。


「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。