Обычно я бы этого не делал. Несколько правильных ответов уже были даны, но поскольку вы все еще изучаете VB.NET, я чувствую, что более подробный ответ был бы полезен для вас. Поэтому мой ответ повторит некоторые из того, что уже сказали другие.
Типы Int64
и Decimal
действительно достаточно велики, чтобы удерживать такое количество. Я подозреваю, что причина, почему Convert.ToInt64
не работает для вас, потому что вы пытаетесь сохранить результаты в Integer
переменной, например:
Dim my_str as String = "201308281110"
Dim my_int as Integer = Convert.ToInt64(my_str) ' Throws an OverflowException
Причина, по которой не может не потому, что ToInt64
не работает. Эта часть заявления действительно работает нормально. Неправильная часть - это то, где вы присваиваете значение переменной my_int
. my_int
объявлен как Integer
. Тип Integer
в VB.NET на самом деле просто псевдоним для Int32
. Другими словами, на самом деле это то же самое, как это:
Dim my_str as String = "201308281110"
Dim my_int as Int32 = Convert.ToInt64(my_str) ' Throws an OverflowException, just like the above example
Чтобы устранить эту проблему, необходимо изменить тип переменной my_int
в Int64
так, что он будет достаточно большим, чтобы вместить значение, возвращаемое из функция ToInt64
.
Dim my_str as String = "201308281110"
Dim my_int as Int64 = Convert.ToInt64(my_str) ' Works
В VB.NET, Long
является псевдонимом Int64
, поэтому в большинстве случаев, это то, что вы должны использовать. Если вы собираетесь использовать Long
, однако, использование метода ToInt64
немного уродливое. Было бы легче читать, чтобы просто использовать Long
с обеих сторон уступки, как это:
Dim my_str as String = "201308281110"
Dim my_int as Long = Long.Parse(my_str) ' Works, just like above
Это также делает код немного безопаснее, потому что он все равно будет работать, даже если размер Long
изменений в будущем (как маловероятно, что может быть).
Тип Decimal
также был бы достаточно большим, чтобы удерживать значение, но он был бы менее эффективным, чем использование Long
, поэтому я бы не рекомендовал его.
Это задает вопрос, однако, «Почему вы это делаете?» Если вам нужно сравнить значение с другой переменной Long
, было бы разумно сделать это, но тогда как вы получили это другое значение Long
? Если вы преобразовываете значения Long
из строк, тогда это не имеет смысла делать это. Строка уже отформатирована таким образом, что ее можно легко сравнить с другими строками того же формата. Например:
Dim dateTime1 As String = "201308281110"
Dim dateTime2 As String = "201308281850"
If dateTime1 > dateTime2 Then
' Doesn't get here
End If
If dateTime1 < dateTime2 Then
' Get's here
End If
If dateTime1 = dateTime2 Then
' Doesn't get here
End If
Если, однако, вы должны разобрать значение, чтобы прочитать его отдельные части (например, дата, время, год, месяц, час), это имеет смысл, чтобы преобразовать значение в значение DateTime
, Или, если вам нужно сравнить строковое значение с другим значением, которое уже сохранено в переменной DateTime
, тогда в этом случае также имеет смысл преобразовать строку в значение DateTime
. В VB.NET, псевдоним DateTime
просто Date
, поэтому в большинстве случаев, вы должны просто использовать, что, как это:
Dim my_str as String = "201308281110"
Dim my_date as Date = Date.ParseExact(my_str, "yyyyMMddHHmm", System.Globalization.CultureInfo.InvariantCulture)
If my_date > Date.Now Then
' Do stuff
End If
я узнал, выполнив некоторые тесты, что целое не может реально провести ряд более 10 цифр! Итак, какой другой тип данных для длинных ints - это новый вопрос? EDIT: нет десятичных знаков, если возможно –
Что случилось с десятичными знаками? – Heinzi
Зачем конвертировать в числовые? Вся причина, почему дата/время, как правило, отформатированы так, что вы можете просто выполнять простые сравнения строк на них. Я не говорю, что это была хорошая идея отформатировать их так, но если они уже отформатированы таким образом, вы можете просто сравнить их как строки. –