2

问题:我可以假设它Str(myString)总是返回与Str(CDbl(myString))(假设它myString是静态类型为字符串)相同的结果吗?


上下文:我试图了解 VBA 的隐式转换。到目前为止,在我看来Str(myString)

  • 隐式解析myString为双精度(文化敏感),然后
  • 将结果转换为不区分区域性的字符串。

例如,使用德语语言环境(即,用作小数分隔符),它认为

" 1.2" = Str(1.2) = Str("1,2") = Str(CDbl("1,2"))

由于这些隐式转换对我来说包含很多“魔法”,因此我试图将使用隐式转换 ( Str(myString)) 的过程重写为使用显式转换而不改变行为的过程。

不幸的是,文档是错误的,因此毫无用处。(文档声称to 的论点Str被解释为 a Long,这显然是垃圾:如果是这样的话Str(1.2),就永远不会产生" 1.2"。)

4

2 回答 2

2

你的说法是真的。如果 x 是字符串数据类型并且包含有效数字,则 Str(x) 和 Str(Cdbl(x)) 给出相同的结果。

我做了一个小测试来说服自己。我使用 Excel,但它与 Access 相同。

Public Function myStr(txt As String) As String
 myStr = Str(txt)
End Function

Public Function myStrCDbl(txt As String) As String
 myStrCDbl = Str(CDbl(txt))
End Function

我尝试了一些关键值 (0, 1.2, 1E+307, 1E-307, ...): myStr 和 myStrCDbl 的结果总是相同的。

我也同意你的观点,文档是错误的。如果 Str() 参数将被解释为Long,则 Str(1.2) 将给出“1”,因为Long它是整数类型。

于 2013-08-21T11:22:39.340 回答
0

同时,我找到了VBA 语言规范,并且可以确认该规范也用“是”回答了这个问题:

  • CDbl,当接收到一个字符串时,对 Double 执行Let -coercion

如果 Expression 的值不是Error 数据值,则返回 Double 数据值,该值是 Expression 被Let强制转换为Double的结果。

  • Str,当接收到一个字符串时,首先对 Double 执行Let -coercion然后应用Str

[如果 Number 是一个字符串, ] 返回的值是 Str 函数的结果,该函数应用于Let将 Number 强制为Double的结果。

于 2013-10-03T07:51:14.700 回答