2015-01-23 3 views
1

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

CStr(CDbl(Now.ToOADate())) 

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

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

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

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

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

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

ТИА

+0

Вызов CDbl избыточен. Метод «ToOADate» уже возвращает double. Почему вы конвертируете его в строку? –

+0

Если вы конвертируете OADate в строку, он отображает строку даты и времени, вам нужно преобразовать/сделать двойным, чтобы отобразить строку с плавающей точкой. –

+0

Строка используется как uniquifier - я знаю, я знаю, вместо этого используйте GUID. Я просто пытаюсь понять, как возникла проблема как проявленная. –

ответ

0

Я не могу воспроизвести эту проблему, но вы проверили свои региональные настройки? Я подозреваю, что неявная проблема преобразования даты/числа/строки, что-то связано с неверно интерпретируемой десятичной точкой (это «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 целыми цифрами?)!

Смежные вопросы