问题 什么是CDbl在做什么?


直到最近,我一直认为是 CDbl(x) VB.NET中的操作本质上是一个强制转换(即,等效于VB的VB) (double)x 在C#);但最近的一项发现显示情况并非如此。

如果我有这个字符串:

Dim s As String = "12345.12345-"

我这样做:

Dim d As Double = CDbl(s)

d 将被设置为值 -12345.12345!现在,不要误解我的意思,这在我的特定场景中很方便;但我不得不承认我很困惑 为什么 这很有效。特别是,我很困惑,因为:

  • Double.Parse 不适用于上述输入。
  • Double.TryParse 不起作用。
  • Convert.ToDouble 不起作用。

怎么 CDbl 好聪明?


10111
2018-04-16 12:49


起源



答案:


它使用Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble()。该函数在对象的GetTypeCode()返回值上包含一个Select语句,因此它可以根据参数的类型使用自定义转换器。字符串转换器会考虑字符串可能包含货币值的可能性,并对字符串进行一些处理以处理该字符串。一种允许的货币值格式是尾随负号。

这不是特别便宜。实现相同转换的最快方法是:

Dim s As String = "12345.12345-"
Dim d As Double = Double.Parse(s, Globalization.NumberStyles.Any)

14
2018-04-16 13:10



感谢您的深入解答。作为转换为.NET的VB6程序员,我总是试图用“.NET方式”做事而不是使用旧的vb函数方式。例如:.substring而不是Left,Mid,Right,.ToLower而不是LCase等。 - Jeremy


答案:


它使用Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble()。该函数在对象的GetTypeCode()返回值上包含一个Select语句,因此它可以根据参数的类型使用自定义转换器。字符串转换器会考虑字符串可能包含货币值的可能性,并对字符串进行一些处理以处理该字符串。一种允许的货币值格式是尾随负号。

这不是特别便宜。实现相同转换的最快方法是:

Dim s As String = "12345.12345-"
Dim d As Double = Double.Parse(s, Globalization.NumberStyles.Any)

14
2018-04-16 13:10



感谢您的深入解答。作为转换为.NET的VB6程序员,我总是试图用“.NET方式”做事而不是使用旧的vb函数方式。例如:.substring而不是Left,Mid,Right,.ToLower而不是LCase等。 - Jeremy


这一直是他们的行为 CDbl() 在Visual Basic 4/5/6中并且当前特定于VB.NET(它是内联的,不是框架的一部分),所以它可能只是为了从早期版本迁移的人。

(就像之前从Visual Basic中购买的功能一样,在.NET之前的版本非常奇怪 QBasic中。)


1
2018-04-16 13:01





如果你进入控制面板中的区域选项,有一个设置让你在数字后面而不是之前放下减号。

我不确定在数字之后哪个系统使用减号,但似乎CDbl被编程为接受两者。在你所接受的,以及所有这些方面要自由。

区域选项还有一个负数的设置,它们在括号中。那样有用吗? - CDbl("(12345.12345)")


0
2018-04-16 13:00