C # - лучшие способы проверки, если строка это число, отличное от int.TryParse ()? - PullRequest
1 голос
/ 01 апреля 2012

Мне часто приходится использовать int.TryParse(), чтобы проверить, является ли значение целым числом. Однако при использовании TryParse я должен передать в функцию ссылочную переменную. Поэтому мне всегда нужно создать временный int для передачи. Обычно это выглядит примерно так:

int my_temp_integer;

int.TryParse(potential_integer, my_temp_integer);

Я нахожу это довольно громоздким, учитывая, что все, что я хочу, - это простой ответ типа «правда / ложь», и мне нет дела до фактического разбора результата. Есть ли лучший способ приблизиться к этому? Почему нет перегруженной функции, где я могу просто передать значение, которое я хочу проверить, и получить ответ истина / ложь?

Спасибо.

Ответы [ 5 ]

8 голосов
/ 01 апреля 2012

Простым решением является создание метода расширения.

public static class StringExtensions {
    public static bool IsInt(this string s) {
        int i;  return Int.TryParse(s, out i);
    }
}

Тогда вы просто используете это так:

 string s = "123";

 if (s.IsInt())
     // do something.
8 голосов
/ 01 апреля 2012

вы можете написать метод расширения:

public static bool IsInt(this string pString)
{
   int value;
   return int.TryParse(pString, out value);
}

тогда ваш пример становится:

potential_integer.IsInt();

EDIT: В последнее время я использовал общую форму этого.

public delegate bool TryParser<T>(string pString, out T pResult);

public static bool Is<T>(this string pString, TryParser<T> pTryParser)
{
   T val;
   return pTryParser(pString, out val);
}

Может затем использовать его следующим образом; он не идеален, но он более лаконичен, чем я нашел:

"1234".Is<int>(int.TryParse);       // true
"asdf123".Is<int>(int.TryParse);    // false
"1.2345".Is<float>(float.TryParse); // true
"1000".Is<byte>(byte.TryParse);     // false

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

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

1 голос
/ 01 апреля 2012

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

что-то вроде этого (вам может потребоваться настроить это в соответствии с вашими потребностями):

public bool IsInt(this string inputData)
{
    Regex isNumber = new Regex(@"^\d+$");
    Match m = isNumber.Match(inputData);

    return m.Success;
}
0 голосов
/ 01 апреля 2012

Более короткая альтернатива Muad'Dib выше:

bool IsInt(string input)
{
    return new System.Text.RegularExpressions.Regex(@"^\d$").IsMatch(input);
}

/ Hans

0 голосов
/ 01 апреля 2012

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

bool isInt = str.TrimEnd( new char[]  {'0','1','2','3','4','5','6','7','8','9'})
                .Length == 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...