Подтвердить что ты не робот

Что такое эквивалент С# для NaN или IsNumeric?

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

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

Ответ 1

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

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);
}

Ответ 2

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

public static Boolean IsNumeric(String input, NumberStyles numberStyle) {
    Double temp;
    Boolean result = Double.TryParse(input, numberStyle, CultureInfo.CurrentCulture, out temp);
    return result;
}

Ответ 3

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

Ответ 4

Мне нравится метод расширения, но не люблю бросать исключения, если это возможно. Я выбрал метод расширения, в котором лучше всего 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

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

Ответ 6

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

public static bool IsNumeric(this String str)
{
    try
    {
        Double.Parse(str.ToString());
        return true;
    }
    catch {
    }
    return false;
}

Ответ 7

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

  • Добавьте ссылку на библиотеку 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));
            }
    

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

Ответ 8

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

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

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

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

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

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

bool IsaNumber = "123456".IsNumeric();

Ответ 9

public static bool IsNumeric(string anyString)
{
    if (anyString == null)
    {
        anyString = "";
    }

    if (anyString.Length > 0)
    {
        double dummyOut = new double();
        System.Globalization.CultureInfo cultureInfo = new System.Globalization.CultureInfo("en-US", true);
        return Double.TryParse(anyString, System.Globalization.NumberStyles.Any, cultureInfo.NumberFormat, out dummyOut);
    }
    else
    {
        return false;
    }
}

Ответ 10

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

Ответ 11

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

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

}

Ответ 12

На самом деле, Double.NaN поддерживается во всех версиях .NET версии 2.0 и выше.

Ответ 13

Я использовал фрагмент Chris Lively (выбранный ответ), инкапсулированный в функцию bool, например, предложение Gishu в течение года или двух. Я использовал его, чтобы убедиться, что некоторые строки запроса были только числовыми, прежде чем продолжить обработку. Я начал получать некоторые ошибочные querystrings, что отмеченный ответ не обрабатывался, в частности, всякий раз, когда запятая была передана после числа, такого как "3645" (возвращено верно). Это результирующий мод:

   static public bool IsNumeric(string s)
   {
      double myNum = 0;
      if (Double.TryParse(s, out myNum))
      {
         if (s.Contains(",")) return false;
         return true;
      }
      else
      {
         return false;
      }
   }