Что такое эквивалент C# NaN или IsNumeric?


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

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

14 ответов:

это не имеет регулярных выражений накладных расходов

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

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

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

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

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

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

}

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

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

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

вы все еще можете использовать функцию 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));
            }
    

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

VB имеет . Вы могли бы ссылаться Microsoft.VisualBasic.dll и использовать его.

дополнение:

public static bool IsNumeric(this String str)
{
    try
    {
        Double.Parse(str.ToString());
        return true;
    }
    catch {
    }
    return false;
}
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;
    }
}

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

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

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

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

У меня немного другая версия, которая возвращает число. Я бы предположил, что в большинстве случаев после тестирования строки вы захотите использовать число.

public bool IsNumeric(string numericString, out Double numericValue)
{
    if (Double.TryParse(numericString, out numericValue))
        return true;
    else
        return false;
}