转换函数(Apache OpenOffice 运行时库)
在很多情况下,必须将一种类型的变量转换为另一种类型的变量。
隐式和显式类型转换
要将变量从一种类型更改为另一种类型,最简便的方法是使用赋值。
Dim A As String
Dim B As Integer
B = 101
A = B
在此示例中,变量 A 是一个字符串,变量 B 是一个整数。Apache OpenOffice Basic 可确保在给变量 A 赋值时,将变量 B 转换为字符串。这种转换看似简单,其实非常复杂:整数 B 以双字节长整型数字形式保留在工作内存中。另一方面,A 是一个字符串,计算机为每个字符(每个数字)保存一个单字节或双字节长整型值。因此,在将 B 中的内容复制到 A 之前,必须将 B 转换为 A 的内部格式。
与大多数其他编程语言不同,Basic 自动执行类型转换。不过,这可能会带来致命的后果。经过仔细检查,以下代码序列
Dim A As String
Dim B As Integer
Dim C As Integer
B = 1
C = 1
A = B + C
乍看上去非常简单,但最终却发现其中暗藏陷阱。Basic 解释器先计算加法过程的结果,然后将该结果转换为字符串,从而生成字符串 2。
另一方面,如果 Basic 解释器先将起始值 B 和 C 转换为字符串,并将加法运算符应用于该结果,则会生成字符串 11。
这也适用于使用变体变量的情况:
Dim A
Dim B
Dim C
B = 1
C = "1"
A = B + C
由于变体变量可以包含数字和字符串,因此,不能确定是将数字 2 还是字符串 11 赋给变量 A。
要避免因隐式类型转换而导致的错误来源,必须以一种严谨的方式编写程序;例如,不使用变体数据类型。
为避免隐式类型转换产生的其他错误,Apache OpenOffice Basic 提供了一系列转换函数,可使用这些函数定义何时应转换运算的数据类型:
- CStr(Var)
- 将任何数据类型转换为字符串。
- CInt(Var)
- 将任何数据类型转换为整数值。
- CLng(Var)
- 将任何数据类型转换为长整型值。
- CSng(Var)
- 将任何数据类型转换为单精度值。
- CDbl(Var)
- 将任何数据类型转换为双精度值。
- CBool(Var)
- 将任何数据类型转换为布尔值。
- CDate(Var)
- 将任何数据类型转换为日期值。
可以使用这些转换函数定义 Apache OpenOffice Basic 应如何执行这些类型转换操作:
Dim A As String
Dim B As Integer
Dim C As Integer
B = 1
C = 1
A = CStr(B + C) ' B and C are added together first, then
' converted to the string "2"
A = CStr(B) + CStr(C) ' B and C are converted into a string,then
' combined to produce the string "11"
在该示例中的第一个加法运算中,Apache OpenOffice Basic 先将整型变量相加,然后将结果转换为字符串。将为 A 赋值字符串 2。在第二个实例中,先将整型变量转换为两个字符串,然后通过赋值将其彼此链接在一起。因此,将为 A 赋值字符串 11。
CSng 和 CDbl 数值转换函数也接受小数。必须使用相应的特定于国家/地区的设置中定义的符号作为小数点符号。相反,在设置数字、日期和时间详细信息的格式时,CStr 方法使用当前选定的特定于国家/地区的设置。
Val 函数不同于 Csng、Cdbl 和 Cstr 方法。它将字符串转换为数字;不过,它始终要求将句点用作小数点符号。
Dim A As String
Dim B As Double
A = "2.22"
B = Val(A) ' Is converted correctly regardless of the
' country-specific settings
检查变量内容
在某些情况下,无法转换日期:
Dim A As String
Dim B As Date
A = "test"
B = A ' Creates error message
在所示的示例中,将 test 字符串赋给日期变量没有任何意义,因此,Basic 解释器将会报告错误。这也适用于尝试将字符串赋给布尔变量的情况:
Dim A As String
Dim B As Boolean
A = "test"
B = A ' Creates error message
Basic 解释器同样会报告错误。
在赋值之前,通过检查程序以确定要赋值的变量内容与目标变量类型是否匹配,可以避免出现这些错误消息。鉴于此目的,Apache OpenOffice Basic 提供了以下测试函数:
- IsNumeric(Value)
- 检查值是否为数字。
- IsDate(Value)
- 检查值是否为日期。
- IsArray(Value)
- 检查值是否为数组。
在查询用户输入时,这些函数尤其有用。例如,可以检查用户键入的数字或日期是否有效。
If IsNumeric(UserInput) Then
ValidInput = UserInput
Else
ValidInput = 0
MsgBox "Error message."
End If
在上一示例中,如果 UserInput 变量包含有效的数字值,则将其赋给 ValidInput 变量。如果 UserInput 不包含有效数字,则将值 0 赋给 ValidInput 并返回错误消息。
虽然 Apache OpenOffice Basic 中提供了用于检查数字、日期详细信息和数组的测试函数,但未提供用于检查布尔值的相应函数。不过,可以使用 IsBoolean 函数模拟此功能:
Function IsBoolean(Value As Variant) As Boolean
On Error Goto ErrorIsBoolean:
Dim Dummy As Boolean
Dummy = Value
IsBoolean = True
On Error Goto 0
Exit Sub
ErrorIsBoolean:
IsBoolean = False
On Error Goto 0
End Function
IsBoolean 函数定义了一个内部布尔型 Dummy 帮助变量,并尝试将传送的值赋给该变量。如果赋值成功,该函数将返回 True。如果失败,则会产生运行时错误,从而终止测试函数以返回错误。
如果 Apache OpenOffice Basic 中的字符串包含非数字值,并且将其赋给某个数字,则 Apache OpenOffice Basic 将不生成错误消息,但会在第一个无效字符处停止转换字符串。此过程与 VBA 不同。在 VBA 中,如果执行相应的赋值,则会引发错误并终止程序实现。 |
Content on this page is licensed under the Public Documentation License (PDL). |