Что такое C # эквивалент NaN или IsNumeric? - PullRequest
95 голосов
/ 13 января 2009

Какой самый эффективный способ проверки входной строки, содержит ли она числовое значение (или, наоборот, не число)? Я думаю, я могу использовать Double.Parse или регулярное выражение (см. Ниже), но мне было интересно, есть ли какие-то встроенные средства для этого, такие как javascript NaN() или IsNumeric() (это был VB, я не могу вспомнить ?).

public static bool IsNumeric(this string value)
{
    return Regex.IsMatch(value, "^\\d+$");
}

Ответы [ 14 ]

165 голосов
/ 13 января 2009

Это не требует регулярных выражений

double myNum = 0;
String testVar = "Not A Number";

if (Double.TryParse(testVar, out myNum)) {
  // it is a number
} else {
  // it is not a number
}

Кстати, все стандартные типы данных, за явным исключением GUID, поддерживают TryParse.

обновление
Secretwep поднял вопрос о том, что значение «2345» пройдет вышеупомянутый тест как число. Однако, если вам нужно убедиться, что все символы в строке являются цифрами, следует использовать другой подход.

пример 1 :

public Boolean IsNumber(String s) {
  Boolean value = true;
  foreach(Char c in s.ToCharArray()) {
    value = value && Char.IsDigit(c);
  }

  return value;
}

или если вы хотите быть немного более модным

public Boolean IsNumber(String value) {
  return value.All(Char.IsDigit);
}
40 голосов
/ 13 января 2009

Я предпочитаю что-то подобное, это позволяет вам решить, на что NumberStyle проверить.

public static Boolean IsNumeric(String input, NumberStyles numberStyle) {
    Double temp;
    Boolean result = Double.TryParse(input, numberStyle, CultureInfo.CurrentCulture, out temp);
    return result;
}
19 голосов
/ 13 января 2009

В дополнение к предыдущим правильным ответам, вероятно, стоит указать, что «Не число» (NaN) в общем его использовании не эквивалентно строке, которая не может быть оценена как числовое значение. NaN обычно понимается как числовое значение, используемое для представления результата «невозможного» вычисления, где результат не определен. В этом отношении я бы сказал, что использование Javascript немного вводит в заблуждение. В C # NaN определяется как свойство одинарного и двойного числовых типов и используется для явной ссылки на результат погружения с нуля на ноль. Другие языки используют его для представления различных «невозможных» значений.

8 голосов
/ 12 июня 2015

Я знаю, что на это ответили по-разному, с расширениями и лямбда-примерами, но комбинацией обоих для простейшего решения.

public static bool IsNumeric(this String s)
{
    return s.All(Char.IsDigit);
}

или если вы используете Visual Studio 2015 (C # 6.0 или выше), тогда

public static bool IsNumeric(this String s) => s.All(Char.IsDigit);

Удивительный C # 6 на одной строке. Конечно, это ограничено, потому что он проверяет только числовые символы.

Чтобы использовать, просто введите строку и вызовите метод, такой как:

bool IsaNumber = "123456".IsNumeric();
5 голосов
/ 31 мая 2013

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

    /// <summary>
    /// Extension method that works out if a string is numeric or not
    /// </summary>
    /// <param name="str">string that may be a number</param>
    /// <returns>true if numeric, false if not</returns>
    public static bool IsNumeric(this String str)
    {
        double myNum = 0;
        if (Double.TryParse(str, out myNum))
        {
            return true;
        }
        return false;
    }
5 голосов
/ 13 января 2009

Да, IsNumeric - это VB. Обычно люди используют метод TryParse (), хотя это немного неуклюже. Как вы предложили, вы всегда можете написать свой собственный.

int i;
if (int.TryParse(string, out i))
{

}
4 голосов
/ 11 июля 2014

Вы все еще можете использовать функцию Visual Basic в C #. Единственное, что вам нужно сделать, это просто следовать моим инструкциям, приведенным ниже:

  1. Добавьте ссылку на библиотеку Visual Basic , щелкнув правой кнопкой мыши свой проект и выбрав «Добавить ссылку»:

enter image description here

  1. Затем импортируйте в свой класс, как показано ниже:

    с использованием Microsoft.VisualBasic;

  2. Далее используйте его, где хотите , как показано ниже:

                if (!Information.IsNumeric(softwareVersion))
            {
                throw new DataException(string.Format("[{0}] is an invalid App Version!  Only numeric values are supported at this time.", softwareVersion));
            }
    

Надеюсь, это поможет и удачи!

4 голосов
/ 02 декабря 2012

Простое расширение:

public static bool IsNumeric(this String str)
{
    try
    {
        Double.Parse(str.ToString());
        return true;
    }
    catch {
    }
    return false;
}
4 голосов
/ 13 января 2009

VB имеет функцию IsNumeric. Вы можете ссылаться на Microsoft.VisualBasic.dll и использовать его.

3 голосов
/ 17 мая 2010

Может быть, это функция C # 3, но вы можете использовать double.NaN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...