У меня до недавнего времени создалось впечатление что 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
настолько умный?
Он использует Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble (). Эта функция содержит оператор Select для возвращаемого значения объекта GetTypeCode (), поэтому он может использовать настраиваемый преобразователь в зависимости от типа аргумента. Конвертер строк учитывает возможность того, что строка может содержать значение валюты, и выполняет некоторую обработку строки, чтобы справиться с этим. Один из разрешенных форматов для денежных значений - отрицательный знак в конце.
Это не особо дешево. Самый быстрый способ добиться такого же преобразования:
Dim s As String = "12345.12345-"
Dim d As Double = Double.Parse(s, Globalization.NumberStyles.Any)
Это всегда было поведение CDbl ()
в Visual Basic 4/5/6 и в настоящее время специфичен для VB.NET (он встроен, а не является частью платформы), поэтому он, вероятно, просто оставлен для людей, переходящих с более ранних версий.
(Очень похоже на странность в Visual Basic до .NET из-за функций, купленных у QBasic .)
Если вы перейдете в раздел «Региональные параметры» на панели управления, там есть параметр, позволяющий ставить знак минус после цифр, а не перед ними.
Я не уверен, в какой системе стоит знак минус после чисел, но похоже, что CDbl запрограммирован на прием обоих. Будьте либеральны в том, что вы принимаете, и все такое.
В региональных параметрах также есть настройка для отрицательных чисел, если они заключены в квадратные скобки. Это работает? - CDbl ("(12345.12345)")