C#開発における文字列が数値を表すかの検証は頻繁に行われるタスクです。この記事では、いくつかの効率的なアプローチを検討し、それぞれの長所と短所を比較することで、特定のニーズに最適な方法を選択するのに役立ちます。
目次
正規表現の使用 (Regex.IsMatch()
)
正規表現は、文字列パターンの検証のための柔軟で強力なソリューションを提供します。Regex.IsMatch()
メソッドを使用すると、入力文字列と照合するパターンを定義できます。このアプローチは一般的に効率的で、幅広い数値形式を処理します。
using System;
using System.Text.RegularExpressions;
public class StringNumberValidator
{
public static bool IsNumber(string str)
{
// 整数、浮動小数点数(負の値を含む)を照合するパターン
return Regex.IsMatch(str, @"^-?d+(.d+)?$");
}
public static void Main(string[] args)
{
Console.WriteLine(IsNumber("123")); // True
Console.WriteLine(IsNumber("123.45")); // True
Console.WriteLine(IsNumber("-123")); // True
Console.WriteLine(IsNumber("-123.45")); // True
Console.WriteLine(IsNumber("123a")); // False
Console.WriteLine(IsNumber("")); // False
}
}
特定の数値形式(例:整数のみ、小数点以下の桁数が限られた数値)に対応するように正規表現を調整できます。これにより、さまざまな要件に高度に適応できます。
TryParse()
メソッドの使用
TryParse()
メソッド(例:int.TryParse()
、double.TryParse()
、decimal.TryParse()
)は、文字列を数値型に解析しようとします。成功した場合はtrue
を、それ以外の場合はfalse
を返します。これは、予想される数値型がわかっている場合、特に簡単で効率的なアプローチです。
using System;
public class StringNumberValidator
{
public static bool IsInteger(string str)
{
int number;
return int.TryParse(str, out number);
}
public static bool IsDouble(string str)
{
double number;
return double.TryParse(str, out number);
}
public static void Main(string[] args)
{
Console.WriteLine(IsInteger("123")); // True
Console.WriteLine(IsDouble("123.45")); // True
Console.WriteLine(IsInteger("-123")); // True
Console.WriteLine(IsInteger("123a")); // False
Console.WriteLine(IsInteger("")); // False
}
}
入力文字列の予想される数値型に基づいて、適切なTryParse()
メソッドを選択してください。
LINQの使用 (Enumerable.All()
)
LINQのEnumerable.All()
は、文字列内のすべての文字が特定の条件を満たしているかどうかを確認する簡潔な方法を提供します。ただし、このアプローチは、小数点または負符号のない正の整数に限定されます。
using System;
using System.Linq;
public class StringNumberValidator
{
public static bool IsPositiveInteger(string str)
{
return !string.IsNullOrEmpty(str) && str.All(char.IsDigit);
}
public static void Main(string[] args)
{
Console.WriteLine(IsPositiveInteger("123")); // True
Console.WriteLine(IsPositiveInteger("123.45")); // False
Console.WriteLine(IsPositiveInteger("-123")); // False
Console.WriteLine(IsPositiveInteger("")); // False
}
}
このメソッドは、その限定された範囲ではシンプルで効率的ですが、他のアプローチの汎用性に欠けています。
手動による文字単位のチェック (foreach
ループ)
手動によるアプローチは、最大の制御を提供しますが、通常は効率が低く、エラーが発生しやすいです。文字列を反復処理し、各文字が数字、小数点、またはマイナス記号(許可されている場合)であることを正しい位置で確認します。
using System;
public class StringNumberValidator
{
public static bool IsNumberManual(string str)
{
if (string.IsNullOrEmpty(str)) return false;
bool hasDecimal = false;
bool hasSign = false;
foreach (char c in str)
{
if (c == '-' && !hasSign && str.IndexOf(c) == 0)
{
hasSign = true;
continue;
}
if (c == '.')
{
if (hasDecimal) return false;
hasDecimal = true;
continue;
}
if (!char.IsDigit(c)) return false;
}
return true;
}
public static void Main(string[] args)
{
Console.WriteLine(IsNumberManual("123")); // True
Console.WriteLine(IsNumberManual("123.45")); // True
Console.WriteLine(IsNumberManual("-123")); // True
Console.WriteLine(IsNumberManual("-123.45")); // True
Console.WriteLine(IsNumberManual("123a")); // False
Console.WriteLine(IsNumberManual("")); // False
Console.WriteLine(IsNumberManual("--123")); //False
Console.WriteLine(IsNumberManual("12.3.4")); //False
}
}
これは最大限の制御を提供しますが、非常に具体的な検証要件がない限り、前述のより簡潔で効率的なメソッドを使用することをお勧めします。
要約すると、最適なアプローチはニーズによって異なります。Regex.IsMatch()
はほとんどのシナリオで堅牢で柔軟なソリューションを提供しますが、TryParse()
は単純な整数または浮動小数点数の検証に効率的です。LINQと手動ループのアプローチは、その制限のために、あまり好まれません。