转换函数(Apache OpenOffice 运行时库)

From Apache OpenOffice Wiki
Jump to: navigation, search
doc OOo
Book.png

在很多情况下,必须将一种类型的变量转换为另一种类型的变量。

隐式和显式类型转换

要将变量从一种类型更改为另一种类型,最简便的方法是使用赋值。

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 解释器先将起始值 BC 转换为字符串,并将加法运算符应用于该结果,则会生成字符串 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

CSngCDbl 数值转换函数也接受小数。必须使用相应的特定于国家/地区的设置中定义的符号作为小数点符号。相反,在设置数字、日期和时间详细信息的格式时,CStr 方法使用当前选定的特定于国家/地区的设置。

Val 函数不同于 Csng、CdblCstr 方法。它将字符串转换为数字;不过,它始终要求将句点用作小数点符号。

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。如果失败,则会产生运行时错误,从而终止测试函数以返回错误。

Template:Documentation/Note

Content on this page is licensed under the Public Documentation License (PDL).
Personal tools