Вот решение, в котором не используется регулярное выражение.
private static bool IsNumberOrGivenString(string number, string text, CultureInfo culture)
{
double result;
if (double.TryParse(number, NumberStyles.Float, culture, out result))
{
return true;
}
return number.Equals(text, StringComparison.OrdinalIgnoreCase);
}
private static bool IsNumberOrGivenString(string number, string text)
{
return IsNumberOrGivenString(number, text, CultureInfo.InvariantCulture);
}
Пример использования:
Console.WriteLine(IsNumberOrGivenString("898", "all")); // true
Console.WriteLine(IsNumberOrGivenString("all", "all")); // true
Console.WriteLine(IsNumberOrGivenString("whatever", "all")); // false
Console.WriteLine(IsNumberOrGivenString("898,0", "all", CultureInfo.GetCultureInfo("sv-SE"))); // true
Console.WriteLine(IsNumberOrGivenString("898,0", "all", CultureInfo.GetCultureInfo("en-US"))); // false
Недостатки этого кода по сравнению с использованием регулярного выражения в том, что он (может) работать локально, используя любой десятичный знак, который используется. Он также потерпит неудачу при наборе числа, скажем, .
, если этот символ не является допустимым десятичным разделителем.
Поскольку при сравнении строк игнорируется регистр, оно также будет соответствовать слову «all» независимо от того, является ли оно «all», «All», «aLl» или любым другим сочетанием прописных и строчных букв.