2013-08-28 73 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位的數字! 那麼,長整數的另一種數據類型是什麼呢? 編輯:如果可能,無小數點 –

+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

您是否需要Option Infer On以便按照我的設想工作? (我喜歡Option Infer On;有些人對此非常反感。) –

3

通常我不會這樣做。已經給出了幾個正確的答案,但由於您仍然在學習VB.NET,所以我覺得更全面的答案對您會有所幫助。所以我的回答會重複一些其他人已經說過的話。

Int64Decimal類型確實足夠大以容納這樣的數字。我懷疑,爲什麼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。 VB.NET中的Integer類型實際上只是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,LongInt64假名,所以在大多數情況下,這是你應該使用什麼。如果您打算使用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值,那麼這樣做沒有意義。該字符串已被格式化,可以方便地與其他格式相同的字符串進行比較。例如:

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