VBA:Str(myString)和Str(CDbl(myString))一样吗?

时间:2013-08-21 08:47:17

标签: vba ms-access internationalization type-conversion

问题:我可以假设Str(myString)将始终返回与Str(CDbl(myString))相同的结果(假设myString被静态输入为字符串)?< / p>


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

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

例如,使用德语区域设置(即使用,作为小数分隔符),它认为

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

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

不幸的是,文档是错误的,因此没用。 (Str的参数documentation claims被解释为Long,这显然是垃圾:如果是这种情况Str(1.2)永远不会产生" 1.2"。 )

2 个答案:

答案 0 :(得分:2)

你的陈述是真的。 Str(x)和Str(Cdbl(x))给出相同的结果,前提是x是String数据类型并包含有效数字。

我做了一个小测试以确信。 我使用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是整数类型。

答案 1 :(得分:0)

与此同时,我找到了VBA language specification并且可以确认规范也回答了“是”的问题:

  • CDbl,收到字符串后,执行 -coercion 加倍:
  

如果Expression的值不是错误 数据值,则返回表达式为 -coerced的结果的Double数据值加倍

  • Str,在收到字符串时,首先执行 -coercion 为Double,然后应用{{1} }:
  

[如果Number是一个字符串,],返回的值是应用于 - 将数字转换为 Double <的结果的Str函数的结果/强>