Что такое эквивалент C# NaN или IsNumeric?
каков наиболее эффективный способ проверки входной строки, содержит ли она числовое значение (или, наоборот, не число)? Я думаю, я могу использовать Double.Parse
или регулярное выражение (см. ниже), но мне было интересно, есть ли какой-то встроенный способ сделать это, например javascript NaN()
или IsNumeric()
(Это был VB, я не могу вспомнить?).
public static bool IsNumeric(this string value)
{
return Regex.IsMatch(value, "^d+$");
}
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#. единственное, что вам нужно сделать, это просто следовать моим инструкциям, приведенным ниже:
- добавить ссылку на библиотеку Visual Basic щелкнув правой кнопкой мыши на вашем проекте и выбрав "добавить ссылку":
затем импорт в своем классе, как показано ниже:
используя Microsoft.VisualBasic;
далее использовать его везде, где вы хотите как показано ниже:
if (!Information.IsNumeric(softwareVersion)) { throw new DataException(string.Format("[{0}] is an invalid App Version! Only numeric values are supported at this time.", softwareVersion)); }
надеюсь, это поможет и удачи!
дополнение:
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; } }
я использовал фрагмент Криса Лайвли (выбранный ответ), инкапсулированный в функцию 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; }