VBのIsNumeric関数を使うと、指定された文字列が正しく数値に変換できるか調べることができます。ここでは、VB.NETのMicrosoft.VisualBasic.Information.IsNumericメソッドを使うことなく、指定した文字列が数値(特にDouble値)に変換できるか調べる方法を紹介します。
IsNumericの代わりになりそうな方法には、
などが考えられます。ここでは主に1と2の方法を紹介します。3と4の方法については、ごく簡単にだけ説明します。
指定された文字列をDouble型の値に変換できるかテストするには、Double.TryParse メソッドが最適です。Double.TryParseメソッドを使えば、Double値に変換できるか調べるだけでなく、変換できるならばその値を取得することもできます。
以下に簡単な例を示します。
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
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メソッドが用意されています。
どうしてもTryParseメソッドを使えない場合は、この方法になります。実際にParseメソッドを呼び出してみて、例外が発生するかを調べる方法です。
なお、Parseメソッドについては「文字列を数値に変換する」で、例外処理については「エラー処理(例外処理)の基本」で詳しく説明しています。
この方法によって、指定した文字列をDoubleに変換できるか調べるメソッドを作成した例を以下に示します。
''' <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
/// <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]+)?$」になるということです。
以下に、文字列が浮動小数点数の形式かを調べる例を示します。
Dim str As String = "123.45" '浮動小数点数か調べる If System.Text.RegularExpressions.Regex.IsMatch(str, "^[-+]?[0-9]*\.?[0-9]+$") Then Console.WriteLine("{0}は浮動小数点数です。", str) End If
string str = "123.45"; //浮動小数点数か調べる if (System.Text.RegularExpressions.Regex.IsMatch(str, @"^[-+]?[0-9]*\.?[0-9]+$")) { Console.WriteLine("{0}は浮動小数点数です。", str); }
正規表現を使う方法と同様にこの方法でDouble型に変換できるかを調べるのは困難ですが、例えば文字がすべて数字かを調べるだけであれば簡単です。
1つの文字(Char値)が数字であるか調べる方法は、「文字が数字か調べる」で説明しています。この方法を使って文字列内の文字がすべて数字(0~9)かを調べるには、次のようにします。
'すべての文字が数字か調べる文字列 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
//すべての文字が数字か調べる文字列 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)に変換できるか調べる」に移動しました。
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。