Что делает CDbl?

У меня до недавнего времени создалось впечатление что 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 настолько умный?

12
задан user2771704 30 January 2014 в 11:56
поделиться

3 ответа

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

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

Dim s As String = "12345.12345-"
Dim d As Double = Double.Parse(s, Globalization.NumberStyles.Any)
15
ответ дан 2 December 2019 в 20:16
поделиться

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

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

1
ответ дан 2 December 2019 в 20:16
поделиться

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

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

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

0
ответ дан 2 December 2019 в 20:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: