一、函数名确定它返回的值的数据类型,如下表所示。
函数名 | 返回数据类型 | expression 参数范围 |
---|---|---|
CBool | 任何有效的 Char、String 或数值表达式。 | |
CByte | 0 到 255(无符号);舍入小数部分。1 | |
CChar | 任何有效的 Char 或 String 表达式;只转换 String 的第一个字符;值可以为 0 到 65535(无符号)。 | |
CDate | 任何有效的日期和时间表示法。 | |
CDbl | 负值取值范围为 -1.79769313486231570E+308 到 -4.94065645841246544E-324;正值取值范围为 4.94065645841246544E-324 到 1.79769313486231570E+308。 | |
CDec | 对 于零变比数值,即无小数位数值,为 +/-79,228,162,514,264,337,593,543,950,335。对于具有 28 位小数位的数字,范围是 +/-7.9228162514264337593543950335。最小的可用非零数是 0.0000000000000000000000000001 (+/-1E-28)。 | |
CInt | -2,147,483,648 到 2,147,483,647;舍入小数部分。1 | |
CLng | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807;舍入小数部分。1 | |
CObj | 任何有效的表达式。 | |
CSByte | -128 到 127;舍入小数部分。1 | |
CShort | -32,768 到 32,767;舍入小数部分。1 | |
CSng | 负值的取值范围为 -3.402823E+38 到 -1.401298E-45;正值的取值范围为 1.401298E-45 到 3.402823E+38。 | |
CStr | CStr 的返回值取决于 expression 参数。请参见返回 CStr 函数的值。 | |
CUInt | 0 到 4,294,967,295(无符号);舍入小数部分。1 | |
CULng | 0 到 18,446,744,073,709,551,615(无符号);舍入小数部分。1 | |
CUShort | 0 到 65,535(无符号);舍入小数部分。1 |
1 小数部分可能要进行称为“四舍六入五成双”的特殊类型舍入。有关更多信息,请参见“备注”。
通常,在 Convert 类或在独立类型结构或类中,应优先使用 Visual Basic 类型转换函数,其次使用 .NET Framework 方法(例如 ToString())。Visual Basic 函数设计用于优化与 Visual Basic 代码之间的交互,并且这些函数使源代码更简短、更易阅读。另外,.NET Framework 转换方法产生的结果不一定与 Visual Basic 函数产生的结果相同,例如当将 Boolean 转换为 Integer 的时候。有关更多信息,请参见数据类型的疑难解答。
行为
-
强制转换。通常,可以使用数据类型转换函数将运算结果强制转换为某一特定数据类型而非默认数据类型。例如,在通常发生单精度、双精度或整型运算的情况下,使用 CDec 强制执行小数运算。
-
转换失败。如果传递给函数的 expression 超出要转换成的数据类型的范围,将发生 OverflowException。
-
小数部分。将一个非整数值转换为整型时,整数转换函数(CByte、CInt、CLng、CSByte、CShort、CUInt、CULng 和 CUShort)将移除小数部分,并将该值舍入为最接近的整数。
如果小数部分正好是 0.5,整数转换函数将其舍入为最接近的偶数整数。例如,0.5 舍入为 0,1.5 和 2.5 都舍入为 2。这有时称为“四舍六入五成双”,其目的是弥补在将许多这样的数字相加时可能会累积的偏量。
CInt 和 CLng 与 Int、Fix 函数 (Visual Basic) 不同,后者截断而不是舍入一个数字的小数部分。此外,Fix和 Int 总是返回与传入的数据类型相同的值。
-
日期/时间转换。使用 IsDate 函数 (Visual Basic) 可确定一个值是否可转换为日期和时间。CDate 能够识别日期文本和时间文本,但不能识别数值。若要将 Visual Basic 6.0 Date 值转换为 Visual Basic 2005 Date值,可以使用 System.DateTime.FromOADate(System.Double) 方法。
-
中性日期/时间值。 Date 数据类型 (Visual Basic) 始终包含日期和时间信息。为进行类型转换,Visual Basic 将 1/1/0001(公元 1 年 1 月 1 日)作为日期的“中性值”,将 00:00:00(午夜)作为时间的中性值。如果将 Date 值转换为字符串,CStr 的结果字符串中将不包含中性值。例如,如果将 #January 1, 0001 9:30:00# 转换为字符串,结果为“9:30:00 AM”;日期信息被删除了。但是,日期信息仍然保留在原来的Date 值中,并可以使用 DatePart 函数 (Visual Basic) 等函数进行恢复。
-
区域差异。涉及字符串的类型转换函数根据应用程序的当前区域设置进行转换。例如,CDate 依据系统的区域设置来识别日期的格式。必须以正确的顺序为区域设置提供日、月、年数据,否则可能无法正确解释日期。系统无法识别包含星期几的字符串(如“Wednesday”)的长日期格式。
如果需要以区域设置指定的格式之外的格式在值的字符串表示形式之间转换,则不能使用 Visual Basic 类型转换函数。如果进行转换,请使用该值类型的 ToString(IFormatProvider) 方法和 Parse(String, IFormatProvider) 方法。例如,将字符串转换为 Double 时,使用System.Double.Parse(System.String,System.IFormatProvider),将 Double 类型的值转换为字符串时,使用 System.Double.ToString(System.IFormatProvider)。
三、CType 函数
CType 函数采用第二个参数 typename,并且将 expression 强制转换为 typename,其中 typename 可以是存在有效转换的任何数据类型、结构、类或接口。
有关 CType 与其他类型转换关键字的比较,请参见 DirectCast 和 TryCast。
CBool 示例
下面的示例使用 CBool 函数将表达式转换为 Boolean 值。如果表达式的计算结果为非零值,CBool 将返回True;否则返回 False。
四、
以适当类型的数值形式返回包含于字符串内的数字。
Public Overloads Function Val(ByVal InputStr As String) As Double ' -or- Public Overloads Function Val(ByVal Expression As Object) As Double ' -or- Public Overloads Function Val(ByVal Expression As Char) As Integer
参数
-
Expression,
InputStr
-
必选。任何有效的 String 表达式、Object 变量或 Char 值。如果 Expression 是 Object 类型,它的值必须可以转换为 String,否则,将出现 ArgumentException 错误。
异常类型 | 错误号 | 条件 |
---|---|---|
InputStr 太大。 | ||
数字格式错误。 | ||
ArgumentException | Object 类型表达式不能转换为字符串。 |
如果正在升级使用非结构化错误处理方式的 Visual Basic 6.0 应用程序,请参见“错误号”一列。(您可以根据 Number 属性(Err 对象)比较错误号。)然而,如果可能,应当考虑用 Visual Basic 的结构化异常处理概述替换这种错误控制。
Val 函数在发现第一个不能将其识别为数字的字符时,将停止读入字符串。那些通常被认为是数值的一部分的符号和字符,例如美元符号与逗号,都不能被识别。但是该函数可以识别基数前缀 &O(八进制)和 &H(十六进制)。空白、制表符和换行符都会从参数中排除。
下面的调用返回值 1615198。
Val(" 1615 198th Street N.E.")
下面的调用返回十进制值 -1。
Val("&HFFFF")
注意 |
---|
Val 函数只将句点 (.) 识别为有效的小数点分隔符。当使用不同的小数点分隔符时(如在国际应用程序中),则应使用 CDbl 或 CInt 将字符串转换为数字。若要将特定区域中的数字的字符串表示形式转换为数值,请使用 Numeric 类型的 Parse(String, IFormatProvider) 方法。例如,将字符串转换为 Double 时,使用System.Double.Parse(System.String,System.IFormatProvider)。
|
在Visual Basic 2005中将加入一个新的运算符——TryCast,相当于C#的as运算符。我一直希望VB有这样一个运算符。VB目前的类型转换运算符主要有 CType和DirectCast。他们的用法几乎一样。我详细比较了一下这两个运算符,得出以下结论:
1、在转换成引用类型时,两者没有什么区别,都是直接调用castclass指令,除非重载了类型转换运算符CType。DirectCast运算符是不能重载的。
2、转换成值类型时,CType会调用VB指定的类型转换函数(如果有的话),比如将String转换为Int32时,就会自动调用 VisualBasic.CompilerServices.IntegerType.FromString,而将Object转换为Int32则会调用 FromObject。其他数值类型转换为Int32时,CType也会调用类型本身的转换方法实施转换。DirectCast运算符则很简单,直接将对 象拆箱成所需类型。
所以在用于值类型时,CType没有DirectCast快速但可以支持更多的转换。在C#中,类型转换则为(type)运算符和as运算符。 (type)运算符的工作方式与VB的DirectCast很相似,也是直接拆箱或castclass的,但是如果遇到支持的类型转换(如long到 int),(type)运算符也会调用相应的转换方法,但不支持从String到int的转换。C#另一个运算符as则更加智能,它只要判断对象的运行实 例能否转成目标类型,然后就可以省略castclass指令,直接按已知类型进行操作,而且编译器还可以自动对as进行优化,比如节省一个对象引用等。所 以在将Object转换成所需的类型时,as是最佳选择。
由于as有很多优点,Visual Basic 2005将这一特性吸收了过来,用TryCast运算符就可以获得和as一样的效果,而且语法与DirectCast或CType一样。