Отсутствие IsNumeric функции в C # - PullRequest
11 голосов
/ 27 мая 2010

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

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

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

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

Ответы [ 13 ]

22 голосов
/ 27 мая 2010

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

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

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

14 голосов
/ 27 мая 2010

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

namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static bool IsInteger(this String input)
        {
             int temp;
             return int.TryParse(input, out temp);        
        }
    }   
}
8 голосов
/ 27 мая 2010

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

5 голосов
/ 27 мая 2010

Ранее я использовал метод расширения , если это вообще помогает:

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

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

4 голосов
/ 27 мая 2010

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

3 голосов
/ 27 мая 2010

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

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

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

2 голосов
/ 27 мая 2010

Лот ответов 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;
    }
1 голос
/ 23 июля 2013

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

Конечно, это не совсем то же самое, что и функция IsNumeric библиотеки Microsoft.VisualBasic, поскольку эта функция (если вы посмотрите на декомпилированный код) включает в себя множество проверок типов и использование интерфейса 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();
1 голос
/ 10 августа 2011

Другой вариант - LINQ!

public static class StringExtensions
{
  public static bool IsDigits(this String text)
  {
    return !text.Any(c => !char.IsDigit(c));
  }
}

Обратите внимание, что предполагается, что вам нужны только цифры 0-9. Если вы хотите принять десятичную точку, знак, экспоненту и т. Д., То отмените IsDigit() на IsNumber().

1 голос
/ 27 мая 2010

Посмотрите на следующий ответ: Что такое C # эквивалент NaN или IsNumeric?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...