Что делает CDbl?

До недавнего времени у меня создалось впечатление, что операция CDbl(x) в VB.NET была по существу отлитой (т.е. эквивалентом 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 настолько умный?

Ответ 1

Он использует Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(). Эта функция содержит оператор Select для возвращаемого значения объекта GetTypeCode(), чтобы он мог использовать собственный конвертер, основанный на типе аргумента. Преобразователь строк учитывает возможность того, что строка может содержать значение валюты и выполняет некоторую обработку в строке, чтобы справиться с этим. Один разрешенный формат для значений валюты - это минус-отрицательный знак.

Это не особенно дешево. Самый быстрый способ добиться такого же преобразования:

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

Ответ 2

Это всегда было поведение CDbl() в Visual Basic 4/5/6 и в настоящее время относится к VB.NET(он встроен, а не является частью фреймворка), поэтому он, вероятно, просто хранится для людей, перемещающихся с более ранних версии.

(Как и странность в pre -.NET Visual Basic из-за функций, приобретенных из QBasic.)

Ответ 3

Если вы перейдете в "Региональные параметры" на панели управления, установите параметр, который позволяет помещать знак минус после, а не раньше, цифр.

Я не уверен, что система использует знак минуса после чисел, но, похоже, CDbl запрограммирован на прием обоих. Будьте либеральны в том, что вы принимаете, и все такое.

Региональные параметры также имеют настройку для отрицательных чисел, где они находятся в скобках. Это работает? - CDbl("(12345.12345)")