2014-02-14 24 views
1

我只是想知道如何正確地的選項嚴格轉換數據類型

  1. 轉換字符串到日期
  2. 整型轉換爲短
  3. 字符串轉換爲整數
  4. 字符串轉換爲加倍

正確無需使用任何類型的任何Ctypes。我打開選項嚴格,現在所有這些錯誤彈出,所以我試圖修復它們:)

+5

看看'Date.Parse','Integer.Parse'和'Double.Parse'初學者 –

+0

會不會,謝謝 – bbesase

+2

將Integer轉換爲Short可能是有損的,你必須執行一個明確的轉換(例如'CShort(123)') –

回答

3

NET提供了幾種方法來檢查,測試和轉換數據。

的TryParse

這也許是轉換的最防彈方式。它是理想的驗證用戶輸入:

Dim n As Int32 
If Int32.TryParse(TextBox.Text, n) Then 
    ' work with n 
Else 
    ' error handling: TextBox.Text cannot convert to int 
End If 

所有的核心數據類型支持(Int64DecimalDate等)。它與其他不同:它不會返回轉換的值,而是指示源字符串是否可以轉換爲變量的Boolean

解析

Dim d as Double = Double.Parse(strVar) 

這是正常使用時,你的代碼中創建strVar,你知道它包含數字和沒有標點等ParseTryParse都允許您解析來自其他文化的數據通過提供FormatProvider和其他選項:

Dim strDec = "$ 123.45" 
Dim decVal As Decimal = Decimal.Parse("$123.45", NumberStyles.Currency) 

其他方法會扼住「$」,風格參數允許它。

Convert.ToInt32/Convert.ToInteger

這其中有許多,許多重載:

Dim intV As Int32 = Convert.ToInt32(aString) 
Dim dblV As Double = Convert.ToDouble(aString) 
Dim lngV As Int64 = Convert.ToInt64(aString) 

Convert.Toxxx方法是略少專門比上面的那些。他們允許文化轉換,但他們假設直接轉換是可能的。也就是說,「123」將轉換爲整數,但不是「123.45」,它不會知道任何貨幣格式的東西。

所以,當你知道值可以轉換時使用它,也許是因爲你將值轉換爲字符串。這也從一個數據庫DataReader工作拆箱對象:

myDT = Convert.ToDateTime(rdr("BirthDate")) 
myV = Convert.ToInt32(rdr("FooValue")) 

提供的數據實際上是爲這些類型的DBDataReader存儲和「盒裝」爲對象,Convert將正常工作。 (請注意,DBDataReaders可以直接返回類型化數據:n = rdr.GetInt32(1)但您不能使用列名稱,只是序號位置)。

CINT,CSng函數...等

CInt類似於Convert.ToInteger,但根據MSDN在VB中的使用進行了優化。例如:

a = Convert.ToInt32("123.50")  ' exception due to decimal point 
a = CInt("123.50")    ' a = 124 

混淆?是的,但是一旦你掌握了它們,你就可以使用最適合這種情況的方法。有沒有辦法指定培養CIntCDec

瓦爾

不要使用Val。永遠。這是一個非常通用的函數,它返回一個Double。使用它會導致各種不良類型轉換:

Dim n = Val(tbSmallValue.Text) 

n作爲一個雙創建因此,如果文本是「5」,然後n = 5.0。當預期使用整數(例如插入數據庫)時,會使用n錯誤。結果良莠不齊:

dd = Val("123.4")   ' = 123.4 
dd = Val("$123.45")  ' = 0.0 
dd = Val("123abc")   ' = 123.0 

NBCIntConvert.ToInt32實施 「銀行家舍入」,其中.50小數四捨五入到最接近偶數123.50124.50兩輪/轉換爲124