Что делает CDbl? - PullRequest
       13

Что делает CDbl?

12 голосов
/ 16 апреля 2010

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

Ответы [ 3 ]

15 голосов
/ 16 апреля 2010

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

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

Dim s As String = "12345.12345-"
Dim d As Double = Double.Parse(s, Globalization.NumberStyles.Any)
1 голос
/ 16 апреля 2010

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

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

0 голосов
/ 16 апреля 2010

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

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

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

...