VBScript преобразует строку в целое число

#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) Затем …