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

文字列が数値に変換できるか調べる
C#でIsNumericに代わるものは?

VBのIsNumeric関数を使うと、指定された文字列が正しく数値に変換できるか調べることができます。ここでは、VB.NETのMicrosoft.VisualBasic.Information.IsNumericメソッドを使うことなく、指定した文字列が数値(特にDouble値)に変換できるか調べる方法を紹介します。

IsNumericの代わりになりそうな方法には、

  1. TryParseメソッドを使う。
  2. Parseメソッドで変換してみて例外が発生するか調べる。
  3. 正規表現で調べてみる。
  4. 一つ一つの文字を調べていき、適切かどうか確かめる。

などが考えられます。ここでは主に1と2の方法を紹介します。3と4の方法については、ごく簡単にだけ説明します。

TryParseメソッドを使用した方法

指定された文字列をDouble型の値に変換できるかテストするには、Double.TryParse メソッドが最適です。Double.TryParseメソッドを使えば、Double値に変換できるか調べるだけでなく、変換できるならばその値を取得することもできます。

以下に簡単な例を示します。

VB.NET
コードを隠すコードを選択
Dim str As String = "-12.34"

'Doubleに変換できるか確かめる
Dim d As Double
If Double.TryParse(str, d) Then
    '変換出来たら、dにその数値が入る
    Console.WriteLine("{0} は数値 {1} に変換できます。", str, d)
Else
    Console.WriteLine("{0} は数字ではありません。", str)
End If

'.NET Framework 1.1以前では、以下のようにする
'If Double.TryParse(str, _
'    System.Globalization.NumberStyles.Float Or _
'        System.Globalization.NumberStyles.AllowThousands, _
'    System.Globalization.NumberFormatInfo.CurrentInfo, d) Then
C#
コードを隠すコードを選択
string str = "-12.34";

//doubleに変換できるか確かめる
double d;
if (double.TryParse(str, out d))
{
    //変換出来たら、dにその数値が入る
    Console.WriteLine("{0} は数値 {1} に変換できます。", str, d);
}
else
{
    Console.WriteLine("{0} は数字ではありません。", str);
}

//.NET Framework 1.1以前では、以下のようにする
//if (double.TryParse(str,
//    System.Globalization.NumberStyles.Float |
//        System.Globalization.NumberStyles.AllowThousands,
//    System.Globalization.NumberFormatInfo.CurrentInfo,
//    out d))

.NET Framework 1.1以前では、TryParseメソッドの2番目と3番目のパラメータに、変換に使用するスタイルとカルチャを指定しなければなりません。これらについて詳しくは、「文字列を数値に変換する」で説明しています。

.NET Framework 1.1以前ではDouble型にしかTryParseメソッドが用意されていませんでしたが、2.0以降ではほとんどの数値型にTryParseメソッドが用意されています。

Parseメソッドで変換してみて例外が発生するか調べる方法

どうしてもTryParseメソッドを使えない場合は、この方法になります。実際にParseメソッドを呼び出してみて、例外が発生するかを調べる方法です。

なお、Parseメソッドについては「文字列を数値に変換する」で、例外処理については「エラー処理(例外処理)の基本」で詳しく説明しています。

この方法によって、指定した文字列をDoubleに変換できるか調べるメソッドを作成した例を以下に示します。

VB.NET
コードを隠すコードを選択
''' <summary>
''' 指定した文字列を倍精度浮動小数点数に変換できるか調べます。
''' </summary>
''' <param name="s">文字列。</param>
''' <returns>s を倍精度浮動小数点数に変換できる場合は true。
''' それ以外は false。</returns>
Public Shared Function TryParseToDouble(ByVal s As String) As Boolean
    Try
        Double.Parse(s)
    Catch ex As StackOverflowException
        Throw
    Catch ex As OutOfMemoryException
        Throw
    Catch ex As System.Threading.ThreadAbortException
        Throw
    Catch
        Return False
    End Try

    Return True
End Function
C#
コードを隠すコードを選択
/// <summary>
/// 指定した文字列を倍精度浮動小数点数に変換できるか調べます。
/// </summary>
/// <param name="s">文字列。</param>
/// <returns>s を倍精度浮動小数点数に変換できる場合は true。
/// それ以外は false。</returns>
public static bool TryParseToDouble(string s)
{
    try
    {
        double.Parse(s);
    }
    catch (StackOverflowException)
    {
        throw;
    }
    catch (OutOfMemoryException)
    {
        throw;
    }
    catch (System.Threading.ThreadAbortException)
    {
        throw;
    }
    catch
    {
        return false;
    }

    return true;
}

正規表現で調べる方法

ここでは正規表現の説明はしませんので、分からないという方は「正規表現の基本」をご覧ください。

Double型に変換できるかを正規表現で調べるのは、とても困難です。しかし大まかに調べるだけであれば、決して難しくありません。

Example: Matching Floating Point Numbers with a Regular Expression」によると、文字列が浮動小数点数かどうかを調べる正規表現パターンは「^[-+]?[0-9]*\.?[0-9]+$」になり、さらに「1.2e-10」のような指数表記を考慮するならば「^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$」になるということです。

以下に、文字列が浮動小数点数の形式かを調べる例を示します。

VB.NET
コードを隠すコードを選択
Dim str As String = "123.45"

'浮動小数点数か調べる 
If System.Text.RegularExpressions.Regex.IsMatch(str, "^[-+]?[0-9]*\.?[0-9]+$") Then
    Console.WriteLine("{0}は浮動小数点数です。", str)
End If
C#
コードを隠すコードを選択
string str = "123.45";

//浮動小数点数か調べる
if (System.Text.RegularExpressions.Regex.IsMatch(str, @"^[-+]?[0-9]*\.?[0-9]+$"))
{
    Console.WriteLine("{0}は浮動小数点数です。", str);
}

1文字ずつ確認する方法

正規表現を使う方法と同様にこの方法でDouble型に変換できるかを調べるのは困難ですが、例えば文字がすべて数字かを調べるだけであれば簡単です。

1つの文字(Char値)が数字であるか調べる方法は、「文字が数字か調べる」で説明しています。この方法を使って文字列内の文字がすべて数字(0〜9)かを調べるには、次のようにします。

VB.NET
コードを隠すコードを選択
'すべての文字が数字か調べる文字列
Dim str As String = "12345"

Dim flag As Boolean = True
Dim c As Char
For Each c In str
    '数字以外の文字が含まれているか調べる
    If c < "0"c OrElse "9"c < c Then
        flag = False
        Exit For
    End If
Next

'結果を表示
If flag Then
    Console.WriteLine("すべて数字です。")
Else
    Console.WriteLine("数字以外の文字が含まれています。")
End If
C#
コードを隠すコードを選択
//すべての文字が数字か調べる文字列
string str = "12345";

bool flag = true;
foreach (char c in str)
{
    //数字以外の文字が含まれているか調べる
    if (c < '0' || '9' < c)
    {
        flag = false;
        break;
    }
}

//結果を表示
if (flag)
{
    Console.WriteLine("すべて数字です。");
}
else
{
    Console.WriteLine("数字以外の文字が含まれています。");
}

文字列が日付型(DateTime)に変換できるか調べる

文字列が日付型(DateTime)に変換できるか調べる」に移動しました。

  • 履歴:
  • 2007/1/15 .NET Framework 2.0に関する記述を追加。
  • 2007/3/23 DateTime.TryParseのサンプルで、表示するテキストが間違えていたのを修正。
  • 2009/4/9 正規表現で調べる方法を追加。
  • 2011/7/10 「文字列が日付型(DateTime)に変換できるか調べる」を別のページに移動。1文字ずつ確認する方法を追加。全体的な書き換え。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。