Аномальное преобразование VB.Net в строку

У нас есть приложение VB.Net, использующее следующее выражение:

CStr(CDbl(Now.ToOADate()))

(Код был перенесен из VB6.) Я тестировал его несколько часов назад, он оценивался/отрисовывался как «42026.786202581» точно так, как должен. Но в небольшом количестве случаев (я могу судить по данным) он отображается как «42026.786202581E+15».

Это, конечно, очень неправильный результат, целая часть — это количество дней с 01.01.1900, а 42К — рациональное значение, его не нужно ни на что умножать (забудьте 10^15-е!)

Возможно, вы заметили, что он использует совместимость с VB6, функции принуждения старого типа, я изменил их на:

Convert.ToDouble(Now.ToOADate()).ToString()

Но я все равно не смог воспроизвести его в лаборатории, поэтому выведите без изменений, как и ожидалось... Двоичный формат OADate на самом деле идентичен двойному поплавку, и с точки зрения преобразований это не должно вызывать затруднений...

В итоге я даже не могу представить, как такое простое выражение могло быть ошибочным на 15 порядков! Любое понимание ценится.

ТИА


person Mark McGinty    schedule 23.01.2015    source источник
comment
Вызов CDbl является излишним. Метод ToOADate уже возвращает двойное значение. Почему вы конвертируете его в строку?   -  person Chris Dunaway    schedule 23.01.2015
comment
Если вы преобразуете OADate в строку, он отображает строку даты и времени, вам необходимо преобразовать/привести к двойному значению, чтобы отобразить строку в формате с плавающей запятой.   -  person Mark McGinty    schedule 23.01.2015
comment
Строка используется как uniquifier — я знаю, я знаю, вместо этого используйте GUID. Я просто пытаюсь понять, как проблема в том виде, в каком она проявилась, была возможна.   -  person Mark McGinty    schedule 23.01.2015
comment
OADate имеет тот же двоичный формат, что и тип double, но есть операторы и другой код класса, связанный с типом, который требует преобразования/приведения.   -  person Mark McGinty    schedule 23.01.2015
comment
Вы предполагаете, что CDbl каким-то образом изменит значение Double, возвращаемое ToOADate? Когда я тестировал, я получил те же значения. DateTime.Now.ToOADate() вернул точно то же значение, что и CDbl(DateTime.Now.ToOADate()). Вызов CDbl в данной ситуации явно излишен. Я не уверен, что, по вашему мнению, меняет дополнительный вызов CDbl.   -  person Chris Dunaway    schedule 26.01.2015
comment
Плохо, я думал, что OADate был типом. (Конечно, это не было избыточным в VB6.) Итак, преобразование двойного числа в двойное не является операцией, как это относится к моему вопросу?   -  person Mark McGinty    schedule 26.01.2015


Ответы (1)


Я не могу воспроизвести эту проблему, но вы проверили свои региональные настройки? Я подозреваю неявную проблему преобразования даты/числа/строки, что-то связанное с неправильной интерпретацией десятичной точки (эта "42026.786202581E+15"). Вы проверили свои региональные настройки? Почему вы заставляете ToOADate() удваиваться, если это уже удвоение? Попробуйте это и расскажите мне, что вы получите:

    Dim a As Double = Now.ToOADate()
    Dim str As String = a.ToString()
    Debug.Print(a) ' Datetime to Double
    Debug.Print(str) ' Double to String
    Debug.Print(CDbl(str)) ' String to Double

Я получил этот ответ (обратите внимание, что моя система настроена на итальянский язык, поэтому я получаю запятую вместо точки):

42027,5610133565
42027,5610133565
42027,5610133565

У вас разные форматы результатов? Если нет, вам следует подробнее изучить это «некоторое небольшое количество случаев» и сообщить, когда/где у вас есть такое значение exp (и уверены, что это было именно «E+15» с 4 целыми цифрами?)!

person Alex Palmer    schedule 23.01.2015