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