Ответ 1
Вы можете использовать встроенную функцию IsNumeric
Dim CanConvert as Boolean = IsNumeric(value)
http://msdn.microsoft.com/en-us/library/6cd3f6w1(VS.71).aspx
Есть ли лучший способ тестирования, если строка может быть преобразована в целое число, отличное от следующего?
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, так как функция, которую я использую для преобразования?
Вы можете использовать встроенную функцию IsNumeric
Dim CanConvert as Boolean = IsNumeric(value)
http://msdn.microsoft.com/en-us/library/6cd3f6w1(VS.71).aspx
Так как TryParse не поддерживается в Compact Framework, regex - ваш следующий лучший вариант.
Первый пример не допускает десятичных знаков. Второй делает.
Regex.IsMatch(value, "^-?\d+$")
Regex.IsMatch(value, "^-?\d+(?:\.\d+)?$")
Если вам нужно дать научную нотацию, вам нужно ее немного подстроить. Это действительно не так уж плохо. У вас есть начало строки ^
, необязательная тире -?
, одна или несколько цифр \d+
, группа, не захватывающая запись (?:)
, которая ищет одну десятичную точку \.
и одну или несколько цифры \d+
. Другой ?
, чтобы разрешить либо ноль, либо один экземпляр группы, не захваченной, а затем конец строки $
.
Edit:
Единственное, о чем я не думал раньше: этот метод немного неточен, потому что вы можете получить действительно огромное число, которое численно является действительным целым числом, но не может быть преобразовано в Int32. Если это возможно, вы можете ограничить количество символов. Вместо \d+
вы можете сделать \d{1,8}
, например.
вы можете использовать Integer.TryParse
, который вернет bool, указывающий, было ли успешным преобразование или нет
Public Function IsInt(ByVal value As Object) As Boolean
Dim i As Integer
Return Integer.TryParse(Convert.ToString(value), i)
End Function
Хорошо, если вы хотите избежать использования исключений, которые вы могли бы сопоставить с обычным выражением, которое позволяет преобразовывать только цифры.
Если вы редко выполняете преобразование, то у вас все хорошо (при условии, что нет TryParse()
, доступного вам) - это не повлияет на производительность.
Если вы собираетесь выполнять миллионы конверсий, и большое количество из них может потерпеть неудачу, исключение, которое вы ловите, может быть проблемой (возможно).
Если вы не можете использовать TryParse(), вероятно, самое лучшее, что нужно сделать (перфекционизм) - просто проверить каждый символ в строке и если это не цифра, возвращает false. Не забудьте указать возможные отрицательные знаки и разделители групп (если вы хотите их поддержать).
В противном случае проанализируйте строку в int, которая будет успешной в 99% случаев. вы получите только исключение, если оно не подойдет. Если вы действительно хотите избежать исключения, которое может генерировать Parse(), вам не сложно просто проанализировать жало нужных цифр и вернуть отказ, если он выходит за пределы диапазона.
Джон Скит сделал быстрый анализ этого назад, прежде чем Framework содержал TryParse()
:
Однако это не устраняет многословие. но до тех пор, пока это автономный метод, нет реальной проблемы с небольшим количеством подробностей.
Dim s as String = "23"
Dim i as Integer
If Int32.TryParse(s, i) Then
' String was a valid integer... '
End If
Используйте метод 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 в моем примере результирующее преобразование для вас, все в одной строке код.
Вот что-то очень похожее на то, что у вас уже есть, но использует класс 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
Вам нужно перевернуть собственное регулярное выражение e.x.: Regex.IsMatch( "4354354", "\ d +" ) и по-прежнему включать блок try/catch в качестве резервной копии.
Сделайте так, как следует
If myString <> "" And IsNumeric(myString) = True Then
If CDbl(myString) - Int(CDbl(myString)) > 0 Then
.... myString is integer
End If
End If