文字列の数値変換

受け取った文字列を数値にしなければいけない時、ざっと3通りの方法が用意されています。

  • Integer.Parse(String)
  • Convert.ToInt32(String)
  • CInt(String) または CType(String, typename)  VBのみ

これらがどう違うのか、実験コードを書いてみます。

Sub Main()

    Console.WriteLine("Input number...")
    Dim strOriginal As String = Console.ReadLine()

     Try
        Dim intCastResult As Integer = Integer.Parse(strOriginal)
        Console.WriteLine("int.Parse : {0}", intCastResult)
    Catch ex As Exception
        Console.WriteLine("int.Parse failed.")
    End Try

    Try
        Dim intConvert As Integer = Convert.ToInt32(strOriginal)
        Console.WriteLine("Convert.ToInt32 : {0}", intConvert)
    Catch ex As Exception
        Console.WriteLine("Convert.ToInt32 failed.")
    End Try

    Try
        Dim intCtype As Integer = CType(strOriginal, Integer)
        Console.WriteLine("Ctype : {0}", intCtype)
    Catch ex As Exception
        Console.WriteLine("Ctype failed.")
    End Try

    Console.WriteLine("Hit any key...")
    Console.ReadKey()
End Sub

これを実行してみると、以下のようになります。
“123,456” (カンマ区切りされた数値)
Input number…
123,456
int.Parse failed.
Convert.ToInt32 failed.
Ctype : 123456
Hit any key…

“\123456″ (通貨記号をつけてみた)
Input number…
\123456
int.Parse failed.
Convert.ToInt32 failed.
Ctype : 123456
Hit any key…

“$123456″ (ではドル記号で)
Input number…
$123456
int.Parse failed.
Convert.ToInt32 failed.
Ctype failed.
Hit any key…

“123.456,45” (海外の3桁区切り)
Input number…
123.456,45
int.Parse failed.
Convert.ToInt32 failed.
Ctype failed.
Hit any key…

“&hFE” (では16進で)
Input number…
&hFE
int.Parse failed.
Convert.ToInt32 failed.
Ctype : 254
Hit any key…

CTypeは地域ロケールに依存しつつも、出来る限り変換しようと試みるようです。これが良い場合もあれば悪い場合もあるでしょう。

さらに、もう一歩突っ込んで、Convert.ToInt32 と int.Parse の違いを見てみましょう。
Convert の方は、IFormatProvider を引数に取ることができます。
Parse も IFormatProviderを引数に取ることができますが、NumberStyles列挙体も引数に取ることができます。例えば円記号とカンマ区切りを許容したいのであれば、

Dim intCastResult As Integer = Integer.Parse(strOriginal, Globalization.NumberStyles.AllowThousands Or Globalization.NumberStyles.AllowCurrencySymbol)

と書けることになります。
が、やはりこれも地域ロケールに依存します。
ロケールに依存させたくないというのであれば、最後はIFormatProviderということになるでしょう。

参考:
Int.Parse (MSDN)
Convert.ToInt32 (MSDN)
CType 関数 (MSDN)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Spam Protection by WP-SpamFree