Определите, является ли строка числом - PullRequest
649 голосов
/ 21 мая 2009

Если у меня есть эти строки:

  1. "abc" = false

  2. "123" = true

  3. "ab2" = false

Есть ли команда, например IsNumeric() или что-то еще, которая может определить, является ли строка допустимым числом?

Ответы [ 23 ]

1017 голосов
/ 21 мая 2009
int n;
bool isNumeric = int.TryParse("123", out n);

Обновление Начиная с C # 7:

var isNumeric = int.TryParse("123", out int n);

var s можно заменить их соответствующими типами!

338 голосов
/ 21 мая 2009

Это вернет true, если input - все числа. Не знаю, лучше ли это, чем TryParse, но это сработает.

Regex.IsMatch(input, @"^\d+$")

Если вы просто хотите узнать, есть ли в нем одно или несколько чисел, смешанных с символами, не указывайте ^ + и $.

Regex.IsMatch(input, @"\d")

Изменить: На самом деле я думаю, что это лучше, чем TryParse, потому что очень длинная строка потенциально может переполнить TryParse.

161 голосов
/ 20 октября 2014

Вы также можете использовать:

stringTest.All(char.IsDigit);

Будет возвращено true для всех числовых цифр (не float) и false, если входная строка представляет собой буквенно-цифровой код любого типа.

Обратите внимание: : stringTest не должно быть пустой строкой, поскольку это пройдет проверку на числовость.

121 голосов
/ 21 мая 2009

Я использовал эту функцию несколько раз:

public static bool IsNumeric(object Expression)
{
    double retNum;

    bool isNum = Double.TryParse(Convert.ToString(Expression), System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInfo, out retNum);
    return isNum;
}

Но вы также можете использовать;

bool b1 = Microsoft.VisualBasic.Information.IsNumeric("1"); //true
bool b2 = Microsoft.VisualBasic.Information.IsNumeric("1aa"); // false

С Сравнительный анализ числовых опций

alt text
(источник: aspalliance.com )

alt text
(источник: aspalliance.com )

32 голосов
/ 21 мая 2009

Это, вероятно, лучший вариант в C #.

Если вы хотите узнать, содержит ли строка целое число (целое число):

string someString;
// ...
int myInt;
bool isNumerical = int.TryParse(someString, out myInt);

Метод TryParse попытается преобразовать строку в число (целое число), и в случае успеха вернет true и поместит соответствующее число в myInt. Если это невозможно, возвращается false.

Решения, использующие альтернативу int.Parse(someString), показанную в других ответах, работают, но это намного медленнее, потому что создание исключений очень дорого. TryParse(...) был добавлен в язык C # в версии 2, и до этого у вас не было выбора. Теперь вы делаете: вам следует избегать альтернативы Parse().

Если вы хотите принять десятичные числа, у десятичного класса также есть метод .TryParse(...). В приведенном выше обсуждении замените int на десятичное, и будут применены те же принципы.

25 голосов
/ 21 мая 2009

Вы всегда можете использовать встроенные методы TryParse для многих типов данных, чтобы увидеть, пройдет ли данная строка.

Пример.

decimal myDec;
var Result = decimal.TryParse("123", out myDec);

Результат будет тогда = True

decimal myDec;
var Result = decimal.TryParse("abc", out myDec);

Результат будет тогда = Ложь

19 голосов
/ 21 мая 2009

В случае, если вы не хотите использовать int.Parse или double.Parse, вы можете свернуть свое собственное что-то вроде этого:

public static class Extensions
{
    public static bool IsNumeric(this string s)
    {
        foreach (char c in s)
        {
            if (!char.IsDigit(c) && c != '.')
            {
                return false;
            }
        }

        return true;
    }
}
14 голосов
/ 29 сентября 2015

Я знаю, что это старая ветка, но ни один из ответов на самом деле не сделал это для меня - ни неэффективно, либо не заключено в капсулу для легкого повторного использования. Я также хотел убедиться, что он вернул false, если строка была пустой или нулевой. TryParse возвращает true в этом случае (пустая строка не вызывает ошибку при разборе как числа). Итак, вот мой метод расширения строки:

public static class Extensions
{
    /// <summary>
    /// Returns true if string is numeric and not empty or null or whitespace.
    /// Determines if string is numeric by parsing as Double
    /// </summary>
    /// <param name="str"></param>
    /// <param name="style">Optional style - defaults to NumberStyles.Number (leading and trailing whitespace, leading and trailing sign, decimal point and thousands separator) </param>
    /// <param name="culture">Optional CultureInfo - defaults to InvariantCulture</param>
    /// <returns></returns>
    public static bool IsNumeric(this string str, NumberStyles style = NumberStyles.Number,
        CultureInfo culture = null)
    {
        double num;
        if (culture == null) culture = CultureInfo.InvariantCulture;
        return Double.TryParse(str, style, culture, out num) && !String.IsNullOrWhiteSpace(str);
    }
}

Простой в использовании:

var mystring = "1234.56789";
var test = mystring.IsNumeric();

Или, если вы хотите проверить другие типы чисел, вы можете указать «стиль». Итак, чтобы преобразовать число с экспонентой, вы можете использовать:

var mystring = "5.2453232E6";
var test = mystring.IsNumeric(style: NumberStyles.AllowExponent);

Или для проверки потенциальной шестнадцатеричной строки вы можете использовать:

var mystring = "0xF67AB2";
var test = mystring.IsNumeric(style: NumberStyles.HexNumber)

Необязательный параметр 'culture' может использоваться почти таким же образом.

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

12 голосов
/ 30 апреля 2013

Если вы хотите поймать более широкий спектр чисел, например, is_numeric * PHP2, вы можете использовать следующее:

// From PHP documentation for is_numeric
// (http://php.net/manual/en/function.is-numeric.php)

// Finds whether the given variable is numeric.

// Numeric strings consist of optional sign, any number of digits, optional decimal part and optional
// exponential part. Thus +0123.45e6 is a valid numeric value.

// Hexadecimal (e.g. 0xf4c3b00c), Binary (e.g. 0b10100111001), Octal (e.g. 0777) notation is allowed too but
// only without sign, decimal and exponential part.
static readonly Regex _isNumericRegex =
    new Regex(  "^(" +
                /*Hex*/ @"0x[0-9a-f]+"  + "|" +
                /*Bin*/ @"0b[01]+"      + "|" + 
                /*Oct*/ @"0[0-7]*"      + "|" +
                /*Dec*/ @"((?!0)|[-+]|(?=0+\.))(\d*\.)?\d+(e\d+)?" + 
                ")$" );
static bool IsNumeric( string value )
{
    return _isNumericRegex.IsMatch( value );
}

Модульный тест:

static void IsNumericTest()
{
    string[] l_unitTests = new string[] { 
        "123",      /* TRUE */
        "abc",      /* FALSE */
        "12.3",     /* TRUE */
        "+12.3",    /* TRUE */
        "-12.3",    /* TRUE */
        "1.23e2",   /* TRUE */
        "-1e23",    /* TRUE */
        "1.2ef",    /* FALSE */
        "0x0",      /* TRUE */
        "0xfff",    /* TRUE */
        "0xf1f",    /* TRUE */
        "0xf1g",    /* FALSE */
        "0123",     /* TRUE */
        "0999",     /* FALSE (not octal) */
        "+0999",    /* TRUE (forced decimal) */
        "0b0101",   /* TRUE */
        "0b0102"    /* FALSE */
    };

    foreach ( string l_unitTest in l_unitTests )
        Console.WriteLine( l_unitTest + " => " + IsNumeric( l_unitTest ).ToString() );

    Console.ReadKey( true );
}

Имейте в виду, что только то, что значение является числовым, не означает, что оно может быть преобразовано в числовой тип. Например, "999999999999999999999999999999.9999999999" является допустимым числовым значением, но оно не вписывается в числовой тип .NET (не определенный в стандартной библиотеке).

9 голосов
/ 16 мая 2014

Если вы хотите проверить, является ли строка числом (я предполагаю, что это строка, поскольку, если это число, да, вы знаете, что оно одно).

  • Без регулярных выражений и
  • максимально используя код Microsoft

Вы также можете сделать:

public static bool IsNumber(this string aNumber)
{
     BigInteger temp_big_int;
     var is_number = BigInteger.TryParse(aNumber, out temp_big_int);
     return is_number;
}

Об этом позаботятся обычные гадости:

  • Минус (-) или Плюс (+) в начале
  • содержит десятичный символ BigIntegers не будет анализировать числа с десятичными точками. (Так: BigInteger.Parse("3.3") выдаст исключение, а TryParse для того же вернет false)
  • без смешных не цифр
  • охватывает случаи, когда число больше, чем обычное использование Double.TryParse

Вам нужно будет добавить ссылку на System.Numerics и иметь using System.Numerics; в верхней части вашего класса (ну, во-вторых, бонус, я думаю:)

...