Одной вещью, которая побеспокоила меня о C# начиная с его выпуска, было отсутствие универсальной функции IsNumeric. Я знаю, что трудно генерировать универсальное решение определить, является ли значение числовым.
Я использовал следующее решение в прошлом, но это не лучшая практика, потому что я генерирую исключение, чтобы определить, является ли значением IsNumeric:
public bool IsNumeric(string input)
{
try
{
int.Parse(input);
return true;
}
catch
{
return false;
}
}
Это - все еще лучший способ приблизиться к этой проблеме или является там более эффективным способом определить, является ли значение числовым в C#?
Попробуйте следующее:
int temp;
return int.TryParse(input, out temp);
Конечно, поведение будет отличаться от Visual Basic IsNumeric
. Если вам нужно такое поведение, вы можете добавить ссылку на сборку «Microsoft.VisualBasic» и напрямую вызвать функцию Microsoft.VisualBasic.Information.IsNumeric
.
Если вы используете Int32.TryParse
, тогда вам не нужно заключать вызов в блок TryCatch, но в противном случае да, это подход, который следует использовать.
Много ответов 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;
}
Взгляните на следующий ответ: Что в C # эквивалентно NaN или IsNumeric?
Double.TryParse обрабатывает все числовые значения, а не только целые числа.
Вместо использования int.Parse вы можете использовать int.TryParse и избежать исключения.
Примерно так
public static bool IsNumeric(string input)
{
int dummy;
return int.TryParse(input, out dummy);
}
В более общем смысле вы можете посмотреть double.TryParse .
Еще одна вещь, которую вы должны учитывать, - это возможность обработки числовой строки для разных культур. Например, греческий (el-GR) использует ,
в качестве десятичного разделителя, а Великобритания (en-GB) использует .
. Таким образом, строка «1000» будет либо 1000, либо 1 в зависимости от текущего языка и региональных параметров. Учитывая это, вы можете подумать о предоставлении перегрузок для IsNumeric, которые поддерживают передачу предполагаемой культуры, формата чисел и т. Д. Взгляните на 2 перегрузки для double.TryParse .
Вы можете использовать методы расширения для расширения типа String, чтобы включить IsInteger:
namespace ExtensionMethods
{
public static class MyExtensions
{
public static bool IsInteger(this String input)
{
int temp;
return int.TryParse(input, out temp);
}
}
}
public bool IsNumeric(string input)
{
int result;
return Int32.TryParse(input,out result);
}
попробуйте это:
public static bool IsNumeric(object o)
{
const NumberStyles sty = NumberStyles.Any;
double d;
return (o != null && Double.TryParse(o.ToString(), sty, null, out d));
}
Я уже использовал следующий метод расширения, если это поможет:
public static int? AsNumeric(this string source)
{
int result;
return Int32.TryParse(source, out result) ? result : (int?)null;
}
Тогда вы можете использовать . HasValue
для bool
, который у вас есть сейчас, или .Value
для значения, но конвертировать только один раз... просто выкидываю это, не уверен, для какой ситуации вы используете это потом.
Не совсем согласен с этим подходом, но вы можете просто вызвать функцию vb.net isNumeric из C#, добавив ссылку на библиотеку Microsoft.VisualBasic.dll...
bool x= Microsoft.VisualBasic.Information.IsNumeric("123");
Другие приведенные подходы лучше, но я хотел добавить этот для полноты картины.