.NET тестирование строки на числовое значение - PullRequest
4 голосов
/ 21 июля 2009

Рассмотрим необходимость функции в C #, которая будет проверять, является ли строка числовым значением.

Требования:

  • должен вернуть логическое значение.
  • функция должна иметь возможность учитывать целые числа, десятичные дроби и отрицательные значения.
  • Предположим, нет using Microsoft.VisualBasic для вызова IsNumeric(). Вот пример изобретения колеса, но упражнение хорошее.

Текущая реализация:

 //determine whether the input value is a number
    public static bool IsNumeric(string someValue)
    {
        Regex isNumber = new Regex(@"^\d+$");
        try
        {
            Match m = isNumber.Match(someValue);
            return m.Success;                           
        }
        catch (FormatException)
        {return false;}
    }

Вопрос : как это можно улучшить, чтобы регулярное выражение совпадало с отрицательными и десятичными числами? Какие радикальные улучшения вы бы сделали?

Ответы [ 7 ]

19 голосов
/ 21 июля 2009

Сверху головы - почему бы просто не использовать double.TryParse? Я имею в виду, если вы действительно не хотите решения регулярных выражений - которое я не уверен, что вам действительно нужно в этом случае

10 голосов
/ 21 июля 2009

Можете ли вы просто использовать .TryParse?

int x;
double y;
string spork = "-3.14";

if (int.TryParse(spork, out x))
    Console.WriteLine("Yay it's an int (boy)!");
if (double.TryParse(spork, out y))
    Console.WriteLine("Yay it's an double (girl)!");
6 голосов
/ 21 июля 2009
Regex isNumber = new Regex(@"^[-+]?(\d*\.)?\d+$");

Обновлено, чтобы разрешить либо +, либо - перед номером.

Edit: ваш блок try ничего не делает, так как ни один из методов внутри него на самом деле не выбрасывает FormatException. Весь метод может быть написан:

// Determine whether the input value is a number
public static bool IsNumeric(string someValue)
{
  return new Regex(@"^[-+]?(\d*\.)?\d+$").IsMatch(someValue);
}
1 голос
/ 21 июля 2009

Ну, для негативов вам нужно будет включить дополнительный знак минус в начале:

^-?\d+$

Для десятичных дробей вам необходимо учитывать десятичную точку:

^-?\d*\.?\d*$

И возможные экспоненциальные обозначения:

^-?\d*\.?\d*(e\d+)?$
0 голосов
/ 21 июля 2009

Кроме того, убедитесь, что полученный код прошел тест Турции:
http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html

0 голосов
/ 21 июля 2009

Я не могу сказать, что использовал бы регулярные выражения, чтобы проверить, является ли строка числовым значением. Медленный и тяжелый для такого простого процесса. Я просто запускаю строку по одному символу за раз, пока не войду в недопустимое состояние:

public static bool IsNumeric(string value)
{
    bool isNumber = true;

    bool afterDecimal = false;
    for (int i=0; i<value.Length; i++)
    {
        char c = value[i];
        if (c == '-' && i == 0) continue;

        if (Char.IsDigit(c))
        {
            continue;
        }

        if (c == '.' && !afterDecimal)
        {
            afterDecimal = true;
            continue;
        }

        isNumber = false;
        break;
    }

    return isNumber;
}

Приведенный выше пример прост и должен выполнить работу для большинства номеров. Однако он не чувствителен с точки зрения культуры, но должен быть достаточно прямолинейным, чтобы сделать его чувствительным с точки зрения культуры.

0 голосов
/ 21 июля 2009

Если вы действительно не хотите использовать регулярные выражения, Нолдорин опубликовал хороший метод расширения в другой Q & A.

Обновление

Как правильно заметил Патрик, ссылка указывает на метод расширения, который проверяет, является ли объект числовым типом, а не представляет ли он числовое значение. Тогда использование double.TryParse в соответствии с предложением Saulius и yodaj007, вероятно, является лучшим выбором, обрабатывая все виды причуд с разными десятичными разделителями, тысячами разделителей и так далее. Просто оберните это в хороший метод расширения:

public static bool IsNumeric(this string value)
{
    double temp;
    return double.TryParse(value.ToString(), out temp);
}

... и выстрелить:

string someValue = "89.9";
if (someValue.IsNumeric()) // will be true in the US, but not in Sweden
{
    // wow, it's a number!
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...