2013-08-28 4 views
2

Хорошо, поэтому я не совсем точно ориентирован, когда речь идет о функциях, доступных в VB. У меня есть строка, содержащая текущую дату и время, и вам нужно преобразовать ее в целое число, чтобы я мог сравнивать время.VB - Преобразование длинного строкового номера в целое число

Dim my_str as String = "201308281110" 
Dim my_int as Integer = Convert.ToInt32(my_str) 

Я не могу сделать это с этой строкой, по-видимому. Потому что я думаю, что это слишком долго для 32-битного целого. Все другие конверсии, которые я пробовал, также терпят неудачу. Это включает в себя «ToInt64», «Int», «CInt» ... Итак, любая идея, как преобразовать эту более длинную строку в целое число?

+0

я узнал, выполнив некоторые тесты, что целое не может реально провести ряд более 10 цифр! Итак, какой другой тип данных для длинных ints - это новый вопрос? EDIT: нет десятичных знаков, если возможно –

+0

Что случилось с десятичными знаками? – Heinzi

+1

Зачем конвертировать в числовые? Вся причина, почему дата/время, как правило, отформатированы так, что вы можете просто выполнять простые сравнения строк на них. Я не говорю, что это была хорошая идея отформатировать их так, но если они уже отформатированы таким образом, вы можете просто сравнить их как строки. –

ответ

5

Почему бы вам просто не использовать Date? Вы можете сравнивать Dates друг с другом, поэтому нет необходимости использовать целое число для сравнения.

Dim my_date as Date = DateTime.ParseExact(my_str, "yyyyMMddhhmm", System.Globalization.CultureInfo.InvariantCulture) 
+0

Как я уже говорил, я не очень ориентирован на существующие варианты. Поэтому я просто иду с тем, что я нахожу первым ..;) –

0

Но Long.Parse работы, а также Convert.ToInt64, поскольку он не переполнение (Int32.MaxValue является 2147483647):

Dim myLong1 = Long.Parse("201308281110") 
Dim myLong2 = System.Convert.ToInt64("201308281110") 

Demo

Обратите внимание, что Long такое же, как Int64.

+0

Вы не указали причину, по которой он переполнял его. –

+0

@StevenDoggart: Я предположил, что он уже знает причину, потому что он упомянул: «Я думаю, что это слишком долго для 32-битного целого». Я также упомянул, что «долго не переполняется». ** Изменить ** Однако отредактировал мой ответ. –

+0

Вам не нужен вариант Infer On для того, чтобы работать, как я предполагаю, вы намерены? (Мне нравится Option Infer On, некоторые люди с энтузиазмом возражают против этого.) –

3

Обычно я бы этого не делал. Несколько правильных ответов уже были даны, но поскольку вы все еще изучаете 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 
Смежные вопросы