Отсутствие функции IsNumeric в С#
Одна вещь, которая беспокоила меня о С# с момента ее выпуска, - это отсутствие общей функции IsNumeric. Я знаю, что сложно создать универсальное решение для определения, если значение является числовым.
В прошлом я использовал следующее решение, но это не лучшая практика, потому что я генерирую исключение, чтобы определить, является ли значение IsNumeric:
public bool IsNumeric(string input)
{
try
{
int.Parse(input);
return true;
}
catch
{
return false;
}
}
Является ли это еще лучшим способом для решения этой проблемы или существует более эффективный способ определить, является ли значение числовым в С#?
Ответы
Ответ 1
Попробуйте следующее:
int temp;
return int.TryParse(input, out temp);
Конечно, поведение будет отличаться от Visual Basic IsNumeric
. Если вы хотите этого поведения, вы можете добавить ссылку на сборку "Microsoft.VisualBasic" и напрямую вызвать функцию Microsoft.VisualBasic.Information.IsNumeric
.
Ответ 2
Вы можете использовать методы расширения, чтобы расширить тип String, включив IsInteger:
namespace ExtensionMethods
{
public static class MyExtensions
{
public static bool IsInteger(this String input)
{
int temp;
return int.TryParse(input, out temp);
}
}
}
Ответ 3
Вместо использования int.Parse вы можете использовать int.TryParse и избегать исключения.
Что-то вроде этого
public static bool IsNumeric(string input)
{
int dummy;
return int.TryParse(input, out dummy);
}
В более общем плане вы можете посмотреть double.TryParse.
Одна вещь, которую вы также должны рассмотреть, - это возможность обработки числовой строки для разных культур. Например, греческий (el-GR) использует ,
как десятичный разделитель, а UK (en-GB) использует .
. Таким образом, строка "1000" будет либо 1000, либо 1 в зависимости от текущей культуры. Учитывая это, вы можете рассмотреть возможность перегрузки для IsNumeric, которые поддерживают передачу планируемой культуры, формат номера и т.д. Взгляните на 2 перегрузки для double.TryParse.
Ответ 4
Я использовал следующий метод расширения, если он вообще помогает:
public static int? AsNumeric(this string source)
{
int result;
return Int32.TryParse(source, out result) ? result : (int?)null;
}
Затем вы можете использовать .HasValue
для bool
, который у вас есть сейчас, или .Value
для значения, но конвертировать только один раз... просто выбросив его там, не уверен, в какой ситуации вы его используете после этого.
Ответ 5
Если вы используете Int32.TryParse
, вам не нужно завершать вызов в блоке TryCatch, но в остальном, да, это подход.
Ответ 6
Не совсем сумасшедший в этом подходе, но вы можете просто вызвать функцию vb.net isNumeric из С#, добавив ссылку на библиотеку Microsoft.VisualBasic.dll...
bool x= Microsoft.VisualBasic.Information.IsNumeric("123");
Другие подходы приведены выше, но хотели добавить это для полноты.
Ответ 7
Много ответов TryParse. Здесь что-то немного отличается, используя Char.IsNumber():
public bool IsNumeric(string s)
{
for (int i = 0; i < s.Length; i++)
{
if (char.IsNumber(s, i) == false)
{
return false;
}
}
return true;
}
Ответ 8
Взгляните на следующий ответ:
Что такое эквивалент С# для NaN или IsNumeric?
Double.TryParse заботится обо всех числовых значениях, а не только в ints.
Ответ 9
Другая опция - LINQ!
public static class StringExtensions
{
public static bool IsDigits(this String text)
{
return !text.Any(c => !char.IsDigit(c));
}
}
Обратите внимание, что это предполагает, что вам нужны только цифры 0-9. Если вы хотите принять десятичную точку, знак, экспоненту и т.д., Тогда repalce IsDigit()
с помощью IsNumber()
.
Ответ 10
Я использую следующий небольшой фрагмент кода в течение многих лет как чистая функция С# IsNumeric
.
Конечно, это не совсем то же самое, что функция Microsoft.VisualBasic
library IsNumeric
как таковая (если вы посмотрите на декомпилированный код) включает много типов проверки и использования IConvertible
, однако эта небольшая функция сработала для меня.
Обратите внимание также, что эта функция использует double.TryParse
, а не int.TryParse
, чтобы разрешить как целочисленные числа (включая long
), так и числа с плавающей запятой. Также обратите внимание, что эта функция специально утверждает InvariantCulture
при разборе (например) чисел с плавающей запятой, поэтому будет правильно идентифицировать как 123.00
, так и 123,00
(обратите внимание на разделители запятой и десятичной точкой) как числа с плавающей запятой.
using System;
using System.Globalization;
namespace MyNumberFunctions
{
public static class NumberFunctions
{
public static bool IsNumeric(this object expression)
{
if (expression == null)
{
return false;
}
double number;
return Double.TryParse(Convert.ToString(expression, CultureInfo.InvariantCulture), NumberStyles.Any, NumberFormatInfo.InvariantInfo, out number);
}
}
}
Использование невероятно просто, поскольку это реализовано как метод расширения:
string myNumberToParse = "123.00";
bool isThisNumeric = myNumberToParse.IsNumeric();
Ответ 11
public bool IsNumeric(string input)
{
int result;
return Int32.TryParse(input,out result);
}
Ответ 12
попробуйте следующее:
public static bool IsNumeric(object o)
{
const NumberStyles sty = NumberStyles.Any;
double d;
return (o != null && Double.TryParse(o.ToString(), sty, null, out d));
}
Ответ 13
Вы все еще можете использовать функцию Visual Basic на С#. Единственное, что вам нужно сделать, это просто следовать моим инструкциям, показанным ниже:
- Добавьте ссылку на библиотеку Visual Basic, щелкнув правой кнопкой мыши на своем проекте и выбрав "Добавить ссылку":
![enter image description here]()
-
Затем импортировать в свой класс, как показано ниже:
с использованием 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));
}
Надеюсь, это поможет и удачи!