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

Documentation note.png 如果 Apache OpenOffice Basic 中的字符串包含非数字值,并且将其赋给某个数字,则 Apache OpenOffice Basic 将不生成错误消息,但会在第一个无效字符处停止转换字符串。此过程与 VBA 不同。在 VBA 中,如果执行相应的赋值,则会引发错误并终止程序实现。
Content on this page is licensed under the Public Documentation License (PDL).
Personal tools