2010-04-16 21 views
11

Tôi đã cho đến gần đây đã được ấn tượng rằng hoạt động CDbl(x) trong VB.NET về cơ bản là một diễn viên (tức là, VB tương đương với (double)x trong C#); nhưng một phát hiện gần đây đã tiết lộ rằng đây không phải là trường hợp.CDbl đang làm gì?

Nếu tôi có chuỗi này:

Dim s As String = "12345.12345-" 

Và tôi làm điều này:

Dim d As Double = CDbl(s) 

d sẽ được thiết lập với giá trị -12345.12345! Bây giờ, đừng làm cho tôi sai, đây là loại thuận tiện trong kịch bản cụ thể của tôi; nhưng tôi phải thừa nhận rằng tôi bị nhầm lẫn là lý do tại sao hoạt động. Cụ thể, tôi bị nhầm lẫn vì:

  • Double.Parse không hoạt động với đầu vào ở trên.
  • Double.TryParse không hoạt động.
  • Convert.ToDouble không hoạt động.

Làm thế nào là CDbl rất thông minh?

Trả lời

14

Nó sử dụng Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(). Hàm đó chứa câu lệnh Select trên giá trị trả về GetTypeCode() của đối tượng để nó có thể sử dụng một trình biến đổi tùy chỉnh dựa trên kiểu của đối số. Trình biến đổi chuỗi xem xét khả năng rằng chuỗi có thể chứa một giá trị tiền tệ và thực hiện một số xử lý trên chuỗi để xử lý điều đó. Một định dạng được phép cho các giá trị tiền tệ là một dấu trừ âm.

Điều này không phải là đặc biệt rẻ. Cách nhanh nhất để đạt được cùng một chuyển đổi là:

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

Cảm ơn câu trả lời chuyên sâu. Là một lập trình viên VB6 đã chuyển đổi sang .NET, tôi luôn cố gắng làm những điều "cách .NET" thay vì sử dụng cách chức năng vb cũ. Ví dụ: .substring thay vì Trái, Giữa, Phải, .ToLower thay vì LCase, v.v. – Jeremy

0

Nếu bạn đi vào Tùy chọn vùng trong Pa-nen điều khiển, có cài đặt cho phép bạn đặt dấu trừ sau, thay vì trước đó, số.

Tôi không chắc chắn hệ thống nào sử dụng dấu trừ sau số, nhưng có vẻ như CDbl được lập trình để chấp nhận cả hai. Hãy tự do trong những gì bạn chấp nhận, và tất cả những điều đó.

Tùy chọn khu vực cũng có cài đặt cho số âm khi chúng ở trong ngoặc vuông. Điều đó có hiệu quả không? - CDbl("(12345.12345)")

1

Đó luôn là hành vi của CDbl() trong Visual Basic 4/5/6 và hiện tại dành riêng cho VB.NET (nội tuyến, không phải là một phần của khung công tác), vì vậy nó có thể chỉ được giữ cho những người di chuyển từ các phiên bản trước.

(Giống như weirdness trong pre-.NET Visual Basic do tính năng mua lại từ QBasic.)

Các vấn đề liên quan