Подтвердить что ты не робот

Отсутствие функции IsNumeric в С#

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

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

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

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

4b9b3361

Ответ 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;
    }

Ответ 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

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

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