#scripting #vbscript
#сценарии #vbscript — скрипт #vbscript
Вопрос:
У меня есть функция, которая считывает текстовый файл, содержащий две строки, она считывает вторую строку и пытается преобразовать строку в длинное целое число. Моя проблема в том, что он не преобразует строку, код для функции выглядит следующим образом:
Function getLastUsed (txtFilePath)
'Read timestamp created by full backup script
Const ForReading = 1
'Error Handling
On Error Resume Next
Err.Clear
Set objFile = Fso.OpenTextFile(txtFilePath, ForReading)
'Read if file was successfully opened, else return 0
If Err.Number = 0 Then
'Value will be on the second line, so readLine twice
Dim valString
valString = objFile.Readline
valString = objFile.Readline
objFile.Close
'If not empty continue, else return 0
If Not IsEmpty(valString) Then
'Return value is IsNumeric, else return 0
If IsNumeric(valString) Then
Dim valInt
valInt = CLng(valString)'<--Won't convert, variable valInt is empty after this line
getLastUsed = valInt
Else
getLastUsed = 0
End If
Else
getLastUsed = 0
End If
Else
getLastUsed = 0
End If
End Function
Я использую Visual Studio для пошагового выполнения и отладки, просматриваю переменную ‘valInt’, она пуста после того, как я вызываю CLng или CInt. Однако, если я жестко закодирую значение, например, valInt = CLng("18")
, оно работает нормально. Я не уверен, чего мне не хватает, любая помощь приветствуется.
Обновить
Хорошо, итак, я попробовал запустить скрипт снова, на этот раз заменив значение в текстовом файле, которое было 20110511123500
чем-то более коротким 2011
, и это сработало. Так что, похоже, это была проблема с точностью. Это приводит ко второму вопросу: какое наибольшее число VBScript может обработать в том, что касается преобразования? Указанное числовое значение — это объем дискового пространства на жестком диске, поэтому мне нужно иметь возможность считывать большие числа. Спасибо за подсказку, Пепто.
ОБНОВЛЕНИЕ 2
Использование double сделало свое дело, спасибо Джи Мастросу.
Комментарии:
1. При отладке, какое значение valString в строке valInt = CLng(valString)?
2. @Pepto — ‘valInt = Empty’ после этой строки.
3. Извините, я не был ясен. Ищем, какое значение имеет valString на момент его передачи в функцию CLng. valString задается с помощью метода ReadLine, какое значение для него установлено? Очевидно, что это числовое значение, а не пустое, основанное на ваших условиях «если». Итак, действительно ли значение что-то вроде «18», и оно не работает?
4. Нет, и я понимаю, что вы предлагаете. Я опубликую и обновлю подробности через мгновение.
5. Double может содержать больше, чем long. Вместо этого используйте valInt = CDbl(valString).
Ответ №1:
Максимальные размеры числовых значений указаны ниже:
Int16: от 32768 до 32767
Int32: от -2147483648 до 2147483647
Int64: от -9223372036854775808 до 9223372036854775807
Удвоить: от -1.79769313486232E 308 до 1.79769313486232E 308
Длина: от -9223372036854775808 до 9223372036854775807
Краткое: от -32768 до 32767
Также есть в системе.Пространство имен Numerics новый тип данных, представленный в .NET 4.0, называется BigInteger (System.Цифры.BigInteger), который может хранить невероятно большие числа.
Более подробную информацию можно найти здесь
CDbl справился с задачей, потому что для преобразования требовался правильный тип данных, основанный на общем размере чисел.
Комментарии:
1. Спасибо Pepto. На самом деле я искал что-то вроде BigInt для VBScript. Также искал диапазоны точности для различных числовых типов данных, но не смог их найти. Это очень помогает, еще раз спасибо.
2. Вот типы, специально предназначенные для VBScript: msdn.microsoft.com/en-us/library/9e7a57cf(VS.85).aspx
Ответ №2:
Здесь мы возвращаемся немного назад, но вообще нет необходимости выполнять какое-либо преобразование. Все переменные в VBScript имеют тип Variant. Язык не поддерживает истинные преобразования. Вот почему можно проводить сравнения между значениями разных типов. Вы можете просто проверить значение с помощью IsNumeric(), а затем продолжить.
Вам также следует объединить вложенные инструкции If. Поскольку во внешней ветви нет инструкции Else, их можно объединить:
Если не пусто(valString) И является числовым (valString) Затем …