Вопрос

У меня есть строка, и я хочу проверить, состоит ли она только из цифр.На самом деле я не хочу (или не должен) анализировать его или что-то в этом роде, я просто хочу знать, что он не содержит ничего, кроме цифр (и никакого разделителя с плавающей запятой, только цифры).

В PHP есть замечательная функция под названием ctype_digit.Есть ли что-нибудь подобное для C# где-нибудь в .Net Framework?Или мне нужно использовать регулярное выражение или что-то в этом роде?

Создать регулярное выражение для этого, конечно, было бы довольно просто, но я бы не хотел его использовать, если есть лучшие способы: p

Это было полезно?

Решение 2

Ответ @Бруно Конде заставило меня задуматься об этом :D

if(subject.All(char.IsDigit))
    // Do something

Не могу поверить, что я не подумал об этом раньше...

Другие советы

Вы могли бы использовать int.TryParse.Он вернет true, если предоставленная строка представляет допустимое число, в противном случае — false.Не забудьте использовать NumerStyles.None чтобы запретить пробелы и знаки плюс/минус.

ОБНОВЛЯТЬ:Как говорит empi, это не будет работать для очень больших строк.Если у вас есть строки произвольного размера, возможно, регулярное выражение — ваш единственный вариант.Вы могли бы сделать что-то вроде Regex.IsMatch(theString,"^[0-9]+$")

bool onlyDigits = "1234".All(c => char.IsDigit(c));

Думаю, вам лучше использовать регулярное выражение, чтобы сделать всю работу за вас..."\d+" должно это сделать... ок, вы сказали, что не хотите его использовать...но это надежный способ гарантировать, что строка содержит только числа, тогда, если регулярное выражение пройдет, вы можете сразу использовать int.Parse(...) .

Да, вы можете использовать

bool Int32.TryParse(string s, out int result);

Пример кода:

string myString = "1265";
int myInt;

if (Int32.TryParse(myString,myInt) // Returns true if mystring contains only digits
{
...
}

Другой вариант — использовать Regex:

    public static bool IsDigit(string myString)
    {
        string pattern = @"^\d*$";

        if (Regex.IsMatch(myString, pattern))
            return true;
        else
            return false;
    }

Вы можете изменить рисунок согласно вашему требованию.

Нет встроенного метода.Int32.TryParse или Int64.TryParse не будут работать для очень длинных строк, содержащих только числа (они также могут допускать использование других символов для представления целых чисел).

Как говорили другие люди, вы можете использовать int.TryParse метод, хотя, если ваше число действительно ЧРЕЗВЫЧАЙНО велико, вы можете использовать TryParse метод других типов, которые имеют больший диапазон, чем int32.(разумеется, используя NumberStyles.None вариант, чтобы избежать знаков и пунктуации).

Вот разбивка:

  1. int -2,147,483,648 .. 2,147,483,647
  2. uint 0 .. 4,294,967,295
  3. long -9,223,372,036,854,775,808 .. 9,223,372,036,854,775,807
  4. ulong 0 .. 18,446,744,073,709,551,615
  5. float -3.402823e38 ..3.402823e38
  6. double -1.79769313486232e308 ..1.79769313486232e308
  7. decimal -79228162514264337593543950335 .. 79228162514264337593543950335

Тот, который может анализировать самые большие числа, - это Double.Если вам нужно использовать число, вы потеряете некоторую точность, но оно может анализировать очень длинные числа (хотя вы говорите, что вам не нужно его использовать, поэтому это не должно быть проблемой).В ходе быстрого теста, который я провел, удалось успешно проанализировать следующую строку:

79228162514264337593543950335792281625142643375935439503357922816251426433759354395033579228162514264337593543950335792281625142643375935439503357922816251426433759354395033579228162514264337593543950335792281625142643375935439503357922816251426433759354395033579228162514264337593543950335234234234234243423

(это 308 символов, если добавить еще одно число, это не удастся)

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

Если вы затем захотите немного сойти с ума, вы можете разделить это на несколько меньших строк и использовать библиотеку задач для параллельной проверки: P

(Я знаю, что это немного оффтопично, но если вы ДЕЙСТВИТЕЛЬНО хотите это сделать, вам следует проверить parallel.for и Partition Ranger, посмотрите этот 10-минутный клип C9: Параллельно для раздела Ranger )

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top