转换Option Strict的DataTypes

时间:2014-02-14 13:25:37

标签: vb.net

我只是想知道如何正确

  1. 将字符串转换为日期
  2. 将整数转换为短
  3. 将字符串转换为整数
  4. 将字符串转换为double
  5. 正确使用任何类型的任何Ctypes。我打开了Option Strict,现在出现了所有这些错误,所以我试图解决它们:)

1 个答案:

答案 0 :(得分: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)

其他方法会阻塞“$”,style参数允许它。

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 ......等

CIntConvert.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创建为Double,如果文本框为“5”,则n = 5.0。当n用于期望整数(例如插入数据库)时,可能会发生错误。结果差异很大:

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

NB CIntConvert.ToInt32实施“银行家舍入”,其中.50分数四舍五入到最接近偶数123.50124.50都围绕/转换为124