Integer.TryParse — лучший способ?

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

Dim tempInt as Integer
If Integer.TryParse(myInt, tempInt) Then

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


person Ryan Smith    schedule 07.01.2009    source источник
comment
что идет после Then ? Вы ничего не делаете с ним как с целым числом? Если нет, то какая вам разница, целое это число или нет?   -  person Jesse Pepper    schedule 07.01.2009
comment
Вы можете написать свой собственный, который проверяет, содержит ли он только цифры и не слишком велик. Но это, вероятно, будет медленнее, чем вызов библиотеки.   -  person paxdiablo    schedule 07.01.2009
comment
вы можете передать значение 0 во втором параметре TryParse, вам не нужно его объявлять.   -  person Tom Anderson    schedule 07.01.2009
comment
Я не люблю ничего делать после Then, мне просто нравится проверять, чтобы убедиться, что все целое. Это заставляет меня чувствовать тепло и пушистость внутри. Спасибо, я не знаю, почему я не подумал просто передать 0 или ничего. Это решит проблему.   -  person Ryan Smith    schedule 07.01.2009


Ответы (7)


Нет необходимости объявлять целое число.

If Integer.TryParse(intToCheck, 0) Then

or

If Integer.TryParse(intToCheck, Nothing) Then

Если у вас есть возможности .Net 3.5, вы можете создать метод расширения для строк.

Public Module MyExtensions

    <System.Runtime.CompilerServices.Extension()> _
    Public Function IsInteger(ByVal value As String) As Boolean
        If String.IsNullOrEmpty(value) Then
            Return False
        Else
            Return Integer.TryParse(value, Nothing)
        End If
    End Function

End Module

И затем вызовите как:

If value.IsInteger() Then

Извините, я знаю, что увлекся, но вы также можете добавить это в класс MyExtensions выше в .Net 3.5 и не беспокоиться, если вам не нужны проверки.

<System.Runtime.CompilerServices.Extension()> _
Public Function ToInteger(ByVal value As String) As Integer
    If value.IsInteger() Then
        Return Integer.Parse(value)
    Else
        Return 0
    End If
End Function

Затем просто используйте

value.ToInteger()

Это вернет 0, если это не допустимое целое число.

person Tom Anderson    schedule 07.01.2009
comment
добавлено в моей версии с «Ничего» и +1 - person Michael Haren; 07.01.2009
comment
+1, комментарий С# не имеет отношения к вопросу, поскольку указывает vb.net. - person paxdiablo; 07.01.2009
comment
Поздравляю, Том, вы взяли отличный лаконичный ответ и превратили его в невнятное эссе на 500 слов. :-) - person paxdiablo; 07.01.2009
comment
Я бы действительно назвал это ToIntegerOrDefault(). ToInteger подразумевает, что на самом деле это целое число. Кроме того, более эффективно выполнять Integer.TryParse непосредственно в методе ToInteger. В противном случае Parse произойдет дважды. - person JaredPar; 07.01.2009
comment
+1 Хороший ответ, Том. Кстати, функция ToInteger объявлена ​​как Boolean. Вы должны отредактировать это, чтобы сказать As Integer. - person Doctor Jones; 08.09.2009
comment
Что это за Ничего, что ты возвращаешь, ноль? - person PositiveGuy; 07.11.2012
comment
Поздний комментарий, но разве IsInteger() не должен вызываться в вашем примере вот так IsInteger(value) не так value.IsInteger() ?? - person Hazem Salama; 18.01.2014
comment
@hsalama нет, потому что это метод расширения. - person Tom Anderson; 22.01.2014

Поскольку вы используете VB.net, вы можете использовать функцию IsNumeric.

If IsNumeric(myInt) Then
    'Do Suff here
End If
person TonyB    schedule 07.01.2009
comment
Вам не нужен VB, среда выполнения VB является частью .NET framework и отлично работает с C#. - person Jonathan Allen; 07.01.2009
comment
IsNumeric все еще находится в .NET только для устаревшей поддержки. TryParse - лучший вариант. - person Justin Clarke; 17.05.2011
comment
Будьте осторожны с IsNumeric, он вернет true даже для некоторых нецелочисленных значений. На странице MSDN IsNumeric возвращает True, если тип данных Expression — Boolean, Byte, Decimal, Double, Integer, Long, SByte, Short, Single, UInteger, ULong или UShort, или объект, который содержит один из этих числовых типов. Он также возвращает True, если Expression является символом или строкой, которую можно успешно преобразовать в число. - person Dejan; 10.12.2013

Попробуйте этот код.

Module IntegerHelpers

  Function IsInteger(ByVal p1 as String) as Boolean
    Dim unused as Integer = 0
    return Integer.TryParse(p1,unused)
  End Function
End Module

Приятно то, что, поскольку она объявлена ​​как функция уровня модуля, ее можно использовать без квалификатора. Пример использования

return IsInteger(mInt)
person JaredPar    schedule 07.01.2009
comment
@ Том, как указал вопрошающий. TryParse требует переменной. Я назвал его неиспользуемым, чтобы указать, что на самом деле он не будет использоваться. Я мог бы передать 0, но я хотел, чтобы было понятнее, что это неиспользованная ссылка. - person JaredPar; 07.01.2009
comment
@ Том, это то, что вы получаете, когда не используете компилятор для проверки своего решения :(. Исправлено - person JaredPar; 07.01.2009

Почему бы не написать метод расширения для очистки кода? Я некоторое время не писал VB.Net, но вот пример на С#:

public static class MyIntExtensionClass
{
  public static bool IsInteger(this string value)
  {
    if(string.IsNullOrEmpty(value))
      return false;

    int dummy;
    return int.TryParse(value, dummy);
  }
}
person Jason Jackson    schedule 07.01.2009
comment
Хорошее предложение, следует опубликовать версию vb.net, она почти идентична, за исключением удаления this в параметре, добавления атрибута Extension к методу, помещения его в модуль (нет необходимости в статических функциях в модуле) и удаления точку с запятой и замените brak на конец *. - person Tom Anderson; 07.01.2009
comment
Кроме того, он может не использовать .Net 3.5. - person Tom Anderson; 07.01.2009

Дж. Эмброуз Литтл выполнил проверки времени для чеков IsNumeric еще в 2003 году. Вы можете повторить упомянутые тесты с версией 2 среды CLR.

person icelava    schedule 07.01.2009

Вариантом может быть:

Int32.TryParse(input_string, Globalization.NumberStyles.Integer)
person Cerveser    schedule 10.03.2014
comment
Документация для Int32.TryParse не содержит этой перегрузки (String, NumberStyles) но вместо этого имеет (String, NumberStyles, IFormatProvider, Int32). - person Sreenikethan I; 08.04.2020
comment
это первый в документации: TryParse(String, Int32) - person Cerveser; 09.04.2020
comment
Но использование неправильное! Из документации: Когда этот метод возвращает значение, [result] содержит 32-битное целое число со знаком, эквивалентное числу, содержащемуся в s. Метод, на который вы ссылаетесь (String, Int32), таков, что проанализированное значение String будет СОХРАНЕНО В ПАРАМЕТЕ Int32 (из-за ключевого слова ByRef)! Так что это все равно, что сказать, что разобрать целое число и сохранить его в этой переменной с именем Globalization.NumberStyles.Integer, что не имеет смысла. - person Sreenikethan I; 10.04.2020
comment
Хорошо, если все, что вам нужно в конце, это значение Boolean, тогда я бы предложил заменить Globalization.NumberStyles.Integer на Nothing, потому что это все равно не имеет никакого эффекта. - person Sreenikethan I; 10.04.2020

person    schedule
comment
Теперь есть отличное применение для nullable! - person lc.; 07.01.2009
comment
Было бы неплохо, если бы библиотеки Framework были переработаны с нуля, чтобы использовать преимущества дженериков и нулевых значений? - person yfeldblum; 07.01.2009