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
所有核心数据类型都支持它(Int64
, Decimal
, Date
ETC)。它与其他的不同:它不返回转换后的值,而是返回一个Boolean
指示源字符串是否可以转换为变量。
Parse
Dim d as Double = Double.Parse(strVar)
创建代码时可以使用它strVar
你知道它包含数字而不是标点符号等。Parse
and TryParse
两者都允许您通过提供一个来解析来自其他文化的数据FormatProvider
和其他选项:
Dim strDec = "$ 123.45"
Dim decVal As Decimal = Decimal.Parse("$123.45", NumberStyles.Currency)
其他方法会因“$”而阻塞,样式参数允许它。
转换.ToInt32 / 转换.ToInteger
这个有很多很多重载:
Dim intV As Int32 = Convert.ToInt32(aString)
Dim dblV As Double = Convert.ToDouble(aString)
Dim lngV As Int64 = Convert.ToInt64(aString)
The 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
令人困惑?是的,但是一旦掌握了它们,您就可以使用最适合情况的方法。无法指定文化CInt
, CDec
etc.
Val
不要使用Val
。曾经。这是一个非常通用的函数,它返回一个Double
。使用它可能会导致各种不良的类型转换:
Dim n = Val(tbSmallValue.Text)
n
创建为 Double,因此如果文本框为“5”,则n
= 5.0
. When n
在需要整数的地方使用(例如插入数据库)可能会发生错误。结果差别很大:
dd = Val("123.4") ' = 123.4
dd = Val("$123.45") ' = 0.0
dd = Val("123abc") ' = 123.0
NB CInt
and Convert.ToInt32
实施“银行家四舍五入”,其中.50
分数四舍五入为最接近的偶数. 123.50
and 124.50
都舍入/转换为124
.