C #: Что-нибудь похожее на функцию php ctype_digit для C #? - PullRequest
1 голос
/ 17 ноября 2009

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

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

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

Ответы [ 7 ]

8 голосов
/ 17 ноября 2009

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

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

5 голосов
/ 17 ноября 2009

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

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

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

3 голосов
/ 17 ноября 2009
bool onlyDigits = "1234".All(c => char.IsDigit(c));
1 голос
/ 17 ноября 2009

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

1 голос
/ 17 ноября 2009

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

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

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

0 голосов
/ 17 ноября 2009

Как уже говорили другие люди, вы можете использовать метод 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,77969313486232e308
  7. decimal -79228162514264337593543950335 .. 79228162514264337593543950335

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

79228162514264337593543950335792281625142643375935439503357922816251426433759354395033579228162514264337593543950335792281625142643375935439503357922816251426433759354395033579228162514264337593543950335792281625142643375935439503357922816251426433759354395033579228162514264337593543950335234234234234243423

(то есть 308 символов, он потерпит неудачу с еще одним числом)

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

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

(Я знаю, это немного оффтоп сейчас, но если вы действительно хотите это сделать, вы должны проверить parallel.for и Partition Ranger, проверить этот клип C9 10 минут: Parallel For Partition Ranger )

0 голосов
/ 17 ноября 2009

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

...