直到最近,我还是认为VB.NET中的CDbl(x)
操作本质上是一个强制转换(即C#中的VB等价于(double)x
);但最近的一项发现显示情况并非如此。
如果我有这个字符串:
Dim s As String = "12345.12345-"
我这样做:
Dim d As Double = CDbl(s)
d
将设置为值-12345.12345
!现在,不要误会我的意思,这在我的特定场景中很方便;但我不得不承认我对为什么这很有用感到困惑。特别是,我很困惑,因为:
Double.Parse
无法使用上述输入。Double.TryParse
不起作用。Convert.ToDouble
不起作用。 CDbl
如此聪明?
答案 0 :(得分:15)
它使用Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble()。该函数在对象的GetTypeCode()返回值上包含Select语句,因此它可以根据参数的类型使用自定义转换器。字符串转换器会考虑字符串可能包含货币值的可能性,并对字符串进行一些处理以处理该字符串。一种允许的货币值格式是尾随负号。
这不是特别便宜。实现相同转换的最快方法是:
Dim s As String = "12345.12345-"
Dim d As Double = Double.Parse(s, Globalization.NumberStyles.Any)
答案 1 :(得分:1)
这一直是CDbl()
在Visual Basic 4/5/6中的行为,目前特定于VB.NET(它是内联的,不是框架的一部分),所以它可能只是为了移动的人而保留从早期版本。
(由于从QBasic购买的功能,在.NET之前的版本中非常奇怪。)
答案 2 :(得分:0)
如果您进入“控制面板”中的“区域选项”,则会设置一个设置,让您在数字之后而不是之前放置减号。
我不确定什么系统在数字后使用减号,但似乎CDbl被编程为接受两者。在你所接受的事情中保持自由,以及所有这些。
区域选项还有一个负数设置,它们在括号中。那样有用吗? - CDbl("(12345.12345)")