Подтвердить что ты не робот

Тестирование, если строка может быть отлита как целое число в VB.NET

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

Public Function IsInt(ByVal value As Object) As Boolean
    Try
        Dim temp As Integer = CInt(value)
        Return True
    Catch ex As Exception
        Return False
    End Try
End Function

"лучше" Я имею в виду менее подробный и/или без исключения.

TryParse - это путь, но я использую Compact Framework 2.0, и tryparse, похоже, не реализован.

Спасибо в любом случае.

Кажется, что MarkJ является правильным, и выше, кажется, функционально то же самое, что IsNumeric, поэтому я полагаю, что мой ответ. Я не знаю, почему я думал, что CInt был более строгим, чем IsNumeric. Я думаю, лучше проверить с использованием стилей CInt IsNumeric, так как функция, которую я использую для преобразования?

4b9b3361

Ответ 2

Так как TryParse не поддерживается в Compact Framework, regex - ваш следующий лучший вариант.

Первый пример не допускает десятичных знаков. Второй делает.

Regex.IsMatch(value, "^-?\d+$")
Regex.IsMatch(value, "^-?\d+(?:\.\d+)?$")

Если вам нужно дать научную нотацию, вам нужно ее немного подстроить. Это действительно не так уж плохо. У вас есть начало строки ^, необязательная тире -?, одна или несколько цифр \d+, группа, не захватывающая запись (?:), которая ищет одну десятичную точку \. и одну или несколько цифры \d+. Другой ?, чтобы разрешить либо ноль, либо один экземпляр группы, не захваченной, а затем конец строки $.

Edit: Единственное, о чем я не думал раньше: этот метод немного неточен, потому что вы можете получить действительно огромное число, которое численно является действительным целым числом, но не может быть преобразовано в Int32. Если это возможно, вы можете ограничить количество символов. Вместо \d+ вы можете сделать \d{1,8}, например.

Ответ 3

вы можете использовать Integer.TryParse, который вернет bool, указывающий, было ли успешным преобразование или нет

Ответ 4

Public Function IsInt(ByVal value As Object) As Boolean
    Dim i As Integer
    Return Integer.TryParse(Convert.ToString(value), i)
End Function

Ответ 5

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

Ответ 6

Если вы редко выполняете преобразование, то у вас все хорошо (при условии, что нет TryParse(), доступного вам) - это не повлияет на производительность.

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

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

В противном случае проанализируйте строку в int, которая будет успешной в 99% случаев. вы получите только исключение, если оно не подойдет. Если вы действительно хотите избежать исключения, которое может генерировать Parse(), вам не сложно просто проанализировать жало нужных цифр и вернуть отказ, если он выходит за пределы диапазона.

Джон Скит сделал быстрый анализ этого назад, прежде чем Framework содержал TryParse():

Однако это не устраняет многословие. но до тех пор, пока это автономный метод, нет реальной проблемы с небольшим количеством подробностей.

Ответ 7

Dim s as String = "23"
Dim i as Integer
If Int32.TryParse(s, i) Then
    ' String was a valid integer... '
End If

Ответ 8

Используйте метод TryParse для типа Integer.

Например:

Private Function CanStringBeCastAsInteger(ByVal myString As String) As Boolean
    Dim myInt As Integer = 0
    Return Integer.TryParse(myString, myInt)
End Function

Преимущество использования метода TryParse заключается в том, что он избегает необходимости бросать и впоследствии улавливать исключение при неудачном сбое. Забрасывание и улавливание исключений - дорогостоящая операция.

Не только метод TryParse вернет результат True/False, сообщив вам, будет ли преобразование успешным или нет, оно также вернет в параметре myInt в моем примере результирующее преобразование для вас, все в одной строке код.

Ответ 9

Вот что-то очень похожее на то, что у вас уже есть, но использует класс Convert вместо CType и не использует TryParse

    Public Function IsInt(ByVal value As Object) As Boolean
    Try
        Convert.ToInt32(value)
        Return True
    Catch ex As System.FormatException
        Return False
    End Try
End Function

Ответ 10

Вам нужно перевернуть собственное регулярное выражение e.x.: Regex.IsMatch( "4354354", "\ d +" ) и по-прежнему включать блок try/catch в качестве резервной копии.

Ответ 11

Сделайте так, как следует

    If myString <> "" And IsNumeric(myString) = True Then

        If CDbl(myString) - Int(CDbl(myString)) > 0 Then
             .... myString is integer
        End If

    End If