Skip to content

Conversion 模块

Conversion 模块汇集了从一种类型的值生成另一种类型的值的过程——在内部数值类型之间强制转换、从字符串解析数字、将数字格式化为字符串,以及处理 Null、错误值和替代数字基数的相关工具。

强制转换为特定类型

最大的一组是 C 前缀函数系列,每种内部数据类型一个。每个函数接受任何有效表达式并生成指定类型的值,如果无法转换则引发运行时错误:CBoolCByteCCurCDateCDblCDecCIntCLngCLngLngCLngPtrCSngCStrCVar

除了其缩窄或扩展行为外,C 前缀函数是区域设置感知的——它们遵循当前的小数分隔符和短日期格式——这使它们成为解析源自用户输入的值的正确选择。它们还起到文档作用:编写 CLng(x) 可以明确中间结果的预期类型,即使在周围上下文会隐式强制转换 x 的情况下也是如此。

vb
Dim Amount As Currency
Amount = CCur("1,234.56")        ' parses with the local decimal separator

另外两个构造函数返回子类型固定的 VariantCVDate 构建子类型为 DateVariant(保留用于与 Date 成为内部类型之前编写的代码兼容),CVErr 构建子类型为 Error 且包含选定错误号的 Variant——这是返回 Variant 的函数在不引发运行时错误的情况下表示"此调用失败并返回此错误代码"的规范方式。

泛型转换

CType 是 twinBASIC 扩展,它以泛型参数接收目标类型,写作 CType(Of type)(value)。它与 C 前缀函数扮演相同的角色,但适用于编译器已知的任何类型,这使其成为没有固定名称函数的 Enum 值、接口和用户自定义类型的标准转换方式。CType 还可以用作指针到 UDT 的转换——参见增强指针功能

vb
Dim day As VbDayOfWeek
day = CType(Of VbDayOfWeek)(1)

截断为整数

IntFix 都丢弃数字的小数部分,但对于负数输入,它们的舍入方向相反。Int 向负无穷舍入,因此 Int(-8.4)-9Fix 向零截断,因此 Fix(-8.4)-8。对于正值,两者相同。两者都不改变其参数的数据类型,这与 CIntCLng 不同,后者既舍入又缩窄到特定的整数类型。

vb
Debug.Print Int(-8.4)            ' -9
Debug.Print Fix(-8.4)            ' -8

数字、字符串和进制

StrHexOct 都返回数字的可打印字符串表示——Str 为十进制,Hex 为十六进制,Oct 为八进制。反过来,ValValDec 从字符串中解析前导数字,分别返回 DoubleDecimal;两者都在第一个无法识别的字符处停止,并且都识别十六进制和八进制字面量的 &H&O 基数前缀。

这五个函数是区域性不变的——它们始终使用句点(.)作为小数分隔符,且从不读取或写入千位分隔符——这使它们适合在固定文件格式或通信协议中往返使用。对于区域设置感知的文本转换,请改用 CStrCDbl(或 CDec)。

vb
Debug.Print Hex(255)             ' "FF"
Debug.Print Oct(8)               ' "10"
Debug.Print Val("&HFF")          ' 255

处理 Null 和错误值

Nz 在其参数为 Null 时返回替代值,其他值保持不变。它最常用于从数据库记录集读取可为空的列,其中直接将该字段与另一个值进行拼接或算术组合会导致 Null 传播到表达式的其余部分。

Error 返回与错误号关联的描述性文本——与使用该错误号引发的 ErrObjectDescription 中显示的文本相同。它是同名 Error 语句的函数对应形式——语句引发运行时错误,而非描述错误。

Macintosh 兼容性

MacID 将四字符的 Macintosh 资源类型或应用程序签名打包为 Long,用于 DirKillShellAppActivate。twinBASIC 目前面向 Windows,在这些函数中该值没有特殊含义;提供 MacID 是为了与最初为经典 Mac 编写的 VBA 代码保持源代码兼容性。

成员

  • CBool -- 将表达式转换为 Boolean
  • CByte -- 将表达式转换为 Byte
  • CCur -- 将表达式转换为 Currency
  • CDate -- 将日期/时间表达式转换为 Date
  • CDbl -- 将表达式转换为 Double
  • CDec -- 将表达式转换为 Decimal
  • CInt -- 将表达式转换为 Integer
  • CLng -- 将表达式转换为 Long
  • CLngLng -- 将表达式转换为 LongLong
  • CLngPtr -- 将表达式转换为 LongPtr
  • CSng -- 将表达式转换为 Single
  • CStr -- 将表达式转换为 String
  • CType -- 泛型类型转换,支持 CType(Of type) 转换运算符
  • CVar -- 将表达式转换为 Variant
  • CVDate -- 将日期/时间表达式转换为子类型为 DateVariant
  • CVErr -- 将数值表达式转换为子类型为 ErrorVariant
  • Error -- 返回与给定错误号对应的错误消息
  • Fix -- 返回数字的整数部分,向零截断
  • Hex -- 返回数字的十六进制字符串表示
  • Int -- 返回数字的整数部分,向负无穷舍入
  • MacID -- 在 Macintosh 上,将 4 字符常量转换为可供 DirKillShellAppActivate 使用的值
  • Nz -- 用指定的替换值替代 Null
  • Oct -- 返回数字的八进制字符串表示
  • Str -- 返回数字的字符串表示
  • Val -- 将字符串解析为 Double
  • ValDec -- 将字符串解析为 Decimal

twinBASIC及其LOGO版权为作者"韦恩"所有