Отсутствие IsNumeric функционирует в C#

Одной вещью, которая побеспокоила меня о C# начиная с его выпуска, было отсутствие универсальной функции IsNumeric. Я знаю, что трудно генерировать универсальное решение определить, является ли значение числовым.

Я использовал следующее решение в прошлом, но это не лучшая практика, потому что я генерирую исключение, чтобы определить, является ли значением IsNumeric:

public bool IsNumeric(string input)
{
    try
    {
        int.Parse(input);
        return true;
    }
    catch
    {
        return false;
    }
}

Это - все еще лучший способ приблизиться к этой проблеме или является там более эффективным способом определить, является ли значение числовым в C#?

11
задан Chris Dwyer 28 May 2010 в 23:35
поделиться

10 ответов

Попробуйте следующее:

int temp;
return int.TryParse(input, out temp);

Конечно, поведение будет отличаться от Visual Basic IsNumeric . Если вам нужно такое поведение, вы можете добавить ссылку на сборку «Microsoft.VisualBasic» и напрямую вызвать функцию Microsoft.VisualBasic.Information.IsNumeric .

22
ответ дан 3 December 2019 в 00:46
поделиться

Если вы используете Int32.TryParse , тогда вам не нужно заключать вызов в блок TryCatch, но в противном случае да, это подход, который следует использовать.

4
ответ дан 3 December 2019 в 00:46
поделиться

Много ответов 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;
    }
2
ответ дан 3 December 2019 в 00:46
поделиться

Взгляните на следующий ответ: Что в C # эквивалентно NaN или IsNumeric?

Double.TryParse обрабатывает все числовые значения, а не только целые числа.

1
ответ дан 3 December 2019 в 00:46
поделиться

Вместо использования 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 .

8
ответ дан 3 December 2019 в 00:46
поделиться

Вы можете использовать методы расширения для расширения типа String, чтобы включить IsInteger:

namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static bool IsInteger(this String input)
        {
             int temp;
             return int.TryParse(input, out temp);        
        }
    }   
}
14
ответ дан 3 December 2019 в 00:46
поделиться
public bool IsNumeric(string input)
{
   int result;
   return Int32.TryParse(input,out result);
}
0
ответ дан 3 December 2019 в 00:46
поделиться

попробуйте это:

public static bool IsNumeric(object o)
{
    const NumberStyles sty = NumberStyles.Any;
    double d;
    return (o != null && Double.TryParse(o.ToString(), sty, null, out d));
}
0
ответ дан 3 December 2019 в 00:46
поделиться

Я уже использовал следующий метод расширения, если это поможет:

public static int? AsNumeric(this string source)
{
  int result;
  return Int32.TryParse(source, out result) ? result : (int?)null;
}

Тогда вы можете использовать . HasValue для bool, который у вас есть сейчас, или .Value для значения, но конвертировать только один раз... просто выкидываю это, не уверен, для какой ситуации вы используете это потом.

5
ответ дан 3 December 2019 в 00:46
поделиться

Не совсем согласен с этим подходом, но вы можете просто вызвать функцию vb.net isNumeric из C#, добавив ссылку на библиотеку Microsoft.VisualBasic.dll...

bool x= Microsoft.VisualBasic.Information.IsNumeric("123");

Другие приведенные подходы лучше, но я хотел добавить этот для полноты картины.

3
ответ дан 3 December 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: