2013-08-21 18 views
2

問題:我能否假定Str(myString)總會返回與Str(CDbl(myString))相同的結果(假設myString是靜態類型化爲字符串)?VBA:Str(myString)是否與Str(CDbl(myString))一樣?


語境: 我想了解VBA的隱式轉換。到目前爲止,在我看來,Str(myString)

  • 隱式地解析myString爲雙(文化敏感),然後
  • 結果轉換成文化不敏感字符串。

例如,使用德語語言環境中(即使用,作爲小數點分隔符),它認爲

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

由於這些隱式轉換中含有大量的「神奇」對我來說,我想重寫一個使用隱式轉換(Str(myString))的過程來使用顯式轉換,而不改變行爲。

不幸的是,該文件是錯誤的,因此,無用。 (該參數Str被解釋爲Long,這顯然是垃圾的documentation claims:如果是這樣的話Str(1.2)不可能產生" 1.2"

+0

只是對您的「解釋爲龍」的評論是垃圾,聲明。也許它寫得不是很好,但我想它指的是支持的精度:長一個比整數大得多(http://msdn.microsoft.com/en-us/library/y595sc15.aspx與http ://msdn.microsoft.com/es-es/library/06bkb8w2(v = vs.90).aspx)和小於一個(http://msdn.microsoft.com/en-us/library/x99xtshc。 ASPX)。因此,此函數支持的最大值是9.2 ... E + 18(十進制值),而不是1.79 .. + 308的雙精度值。 – varocarbas

+0

@varocarbas:有趣的想法。不過,我認爲Double精度實際上比Long精度要大:Double具有[53位精度](http://en.wikipedia.org/wiki/Double-precision_floating-point_format)(不包括指數) ,而Long是VBA中的32位數字。 – Heinzi

+0

這就是我所說的。 「小於兩倍」...「此功能支持的最大值是9.2 ... E + 18」( - >最大長度值)不是1.79 .. + 308的雙倍 – varocarbas

回答

2

你的說法是正確的。如果x是String數據類型並且包含有效數字,則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是整數類型。

+0

我同意。這個'Debug.Print Evaluate(Str(1.2)),Evaluate(Str(CDbl(「1.2」)))'會在一行中做同樣的事情(*通過*提供你自己的參數) – 2013-08-21 11:38:26

0

在平均時間,我已經找到了VBA language specification,可以確認該規範也回答了「是」:

  • CDbl,接收字符串時,執行 - 強迫到雙:

如果表達式的值不是錯誤d ata值返回作爲表達式的結果的Double數據值爲-強制爲雙重

  • Str,接收的字符串時,首先執行 -coercion到雙然後應用Str

[如果號是一個字符串,]返回值是應用於的結果的Str函數的結果令 -coercing數字爲Double

相關問題