В С#, как проверить, содержит ли строка целое число?

Я просто хочу знать, содержит ли строковая переменная разбираемое положительное целочисленное значение. Я НЕ хочу анализировать значение прямо сейчас.

В настоящее время я делаю:

int parsedId;
if (
    (String.IsNullOrEmpty(myStringVariable) ||
    (!uint.TryParse(myStringVariable, out parsedId))
)
{//..show error message}

Это некрасиво – как бы быть более кратким?

Примечание. Я знаю о методах расширения, но мне интересно, есть ли что-то встроенное.


person Marcel    schedule 15.08.2013    source источник
comment
Нужно ли разрешать отрицательные числа?   -  person Matthew Watson    schedule 15.08.2013
comment
Сохраните код, который у вас есть, и живите с уродством.   -  person Jeppe Stig Nielsen    schedule 15.08.2013
comment
@MatthewWatson Спасибо, что заметили это. Положительно только в моем случае, уточнил вопрос.   -  person Marcel    schedule 15.08.2013
comment
Измените int.TryParse на uint.TryParse, чтобы строки, которые выглядят как отрицательные целые числа, возвращали false.   -  person Jeppe Stig Nielsen    schedule 15.08.2013
comment
Спасибо, @JeppeStigNielsen, что указали на это. Обновил вопрос.   -  person Marcel    schedule 15.08.2013


Ответы (8)


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

     bool isIntString = "your string".All(char.IsDigit)

Вернет true, если строка является числом

    bool containsInt = "your string".Any(char.IsDigit)

Возвращает true, если строка содержит цифру

person DGibbs    schedule 15.08.2013
comment
Если str равно "iuhs,./hu3dwuh", то str.Any(char.IsDigit) будет истинным. - person Jeppe Stig Nielsen; 15.08.2013
comment
Я не против, но 1. В классе string нет статической функции с именем Any (предположительно, вы имели в виду, что строковая переменная будет называться string, но это невозможно); 2. Если вы имеете в виду метод расширения Linq Any, вы должны называть его следующим образом: s.Any(c => char.IsDigit(c)); 3. Я думаю, он хочет, чтобы целая строка была целым числом, а не просто содержала где-то цифру; иначе ему нет смысла использовать int.TryParse. - person Magnus Grindal Bakken; 15.08.2013
comment
@MagnusGrindalBakken Относительно вашего (2): Нет, поскольку подпись и тип возвращаемого значения верны, выражение char.IsDigit (так называемая группа методов) может быть преобразовано в тип Func<char, bool> посредством неявного преобразования, так что часть в порядке. - person Jeppe Stig Nielsen; 15.08.2013
comment
@JeppeStigNielsen Хороший звонок. Я всегда забываю об этом. - person Magnus Grindal Bakken; 15.08.2013
comment
Я проголосовал за, но было бы неплохо, если бы вы могли обновить свой ответ, чтобы он был правильным linq, как предложил Магнус. - person TroySteven; 28.01.2020
comment
@TroySteven - Он ошибается? Вам не обязательно использовать лямбда-синтаксис, например s.Any(x => char.IsDigit(x)), вы можете просто передать char.IsDigit в качестве делегата, попробуйте... dotnetfiddle.net /qS59c0, а первый пример удовлетворяет условию «вся строка является целым числом» - person DGibbs; 28.01.2020

Предполагая, что вы хотите проверить, что все символы в строке являются цифрами, вы можете использовать метод расширения Enumerable.All с помощью метода Char.IsDigit следующим образом:

bool allCharactersInStringAreDigits = myStringVariable.All(char.IsDigit);
person dtb    schedule 15.08.2013
comment
Что, если myStringVariable содержит цифры из множества различных алфавитов со всего мира, например, индийско-арабские цифры в сочетании с западными цифрами? - person Jeppe Stig Nielsen; 15.08.2013
comment
В этом случае ۲۲۲ даст true, но анализ его как int вызовет исключение. - person Matthew Watson; 15.08.2013
comment
Если вы хотите проверить, является ли какой-либо из символов числовым, а не все из них, вы можете использовать - bool anyCharactersInStringAreDigits = myStringVariable.Any(char.IsDigit); - person Deano; 10.01.2014

Может быть, это может помочь

string input = "hello123world";
bool isDigitPresent = input.Any(c => char.IsDigit(c));

ответ от msdn.

person panako    schedule 14.12.2015
comment
Это не правильно. Он будет проверять, присутствуют ли некоторые цифры, но не проверяет, представляет ли строка в целом целочисленное значение. - person Marcel; 12.04.2019
comment
Требования вопроса заключаются в том, содержит ли строка поддающееся разбору целое число, а не в том, представляет ли вся строка число. - person Ben; 20.03.2020

Вы можете проверить, содержит ли строка только числа:

Regex.IsMatch(myStringVariable, @"^-?\d+$")

Но число может быть больше Int32.MaxValue или меньше Int32.MinValue — имейте это в виду.

Другой вариант - создать метод расширения и переместить туда уродливый код:

public static bool IsInteger(this string s)
{
   if (String.IsNullOrEmpty(s))
       return false;

   int i;
   return Int32.TryParse(s, out i);
}

Это сделает ваш код более чистым:

if (myStringVariable.IsInteger())
    // ...
person Sergey Berezovskiy    schedule 15.08.2013
comment
прямой ответ - person Radhe Sham; 28.11.2017
comment
Хороший. Я улучшил ваш метод для обработки массива строк. public static bool IsInteger(this string[] str) { bool isInteger = false; if (str == null) return isInteger; foreach (var s in str) { if (String.IsNullOrEmpty(s)) return isInteger; int i; isInteger = Int32.TryParse(s, out i); if (isInteger == false) return isInteger; } return isInteger; } - person Ashish Kumar Jaryal; 16.01.2019

Извините, не совсем понял ваш вопрос. Так что-то вроде этого?

str.ToCharArray().Any(char.IsDigit);

Или значение должно быть полностью целым, без каких-либо дополнительных строк?

if(str.ToCharArray().All(char.IsDigit(c));
person SBoss    schedule 15.08.2013
comment
Что ваш второй ответ вернет для ----- ? - person I4V; 15.08.2013
comment
Только что понял ;) - person SBoss; 15.08.2013
comment
@SBoss Это должно точно анализироваться как int, но я просто хочу сейчас это, а не результат значения синтаксического анализа. - person Marcel; 15.08.2013
comment
Извините, Марсель, я должен был лучше прочитать ваш вопрос. Мой второй ответ не намного красивее, но это альтернатива. - person SBoss; 15.08.2013
comment
Я получаю первый отрицательный голос за то, что не понял сути вопроса, но, поскольку я изменил свой ответ, почему второй? - person SBoss; 15.08.2013

Эта работа для меня.

("your string goes here").All(char.IsDigit)
person sarmad salik    schedule 12.04.2019
comment
Спасибо за ваш вклад. Но, тем не менее, это повторение ответа, который @dtb уже дал несколько лет назад. - person Marcel; 12.04.2019

Похоже, ответ просто нет.

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

person Marcel    schedule 15.08.2013
comment
Я предполагаю, что разработчики C# могли бы ввести новый синтаксический сахар для этого случая, когда нам не нужна переменная out. Это может выглядеть как int.TryParse(myStringVariable, out void) или что-то в этом роде. Тогда компилятор должен автоматически ввести сгенерированную локальную переменную правильного типа, но это не будет выглядеть некрасиво в коде. Конечно, сгенерированная переменная не будет доступна (должна иметь какое-то сумасшедшее недопустимое имя). - person Jeppe Stig Nielsen; 15.08.2013

        string text = Console.ReadLine();
        bool isNumber = false;

        for (int i = 0; i < text.Length; i++)
        {
            if (char.IsDigit(text[i]))
            {
                isNumber = true;
                break;
            }
        }

        if (isNumber)
        {
            Console.WriteLine("Text contains number.");
        }
        else
        {
            Console.WriteLine("Text doesn't contain number.");
        }

        Console.ReadKey();

Или Линк:

        string text = Console.ReadLine();

        bool isNumberOccurance =text.Any(letter => char.IsDigit(letter));
        Console.WriteLine("{0}",isDigitPresent ? "Text contains number." : "Text doesn't contain number.");
        Console.ReadKey();
person Zsolt    schedule 16.10.2020
comment
Первый блок не соответствует более кратким требованиям. - person Calculuswhiz; 16.10.2020