VB6 IsNumeric может быть неправильным?

Вы просто удаляете всю эту папку (obj \ Debug) из решения (не удаляйте ее из каталога) и пытаетесь опубликовать ее, безусловно, будет работать.

5
задан Andrei 5 May 2012 в 08:25
поделиться

10 ответов

У Вас может быть переполнение, должное максимальный целочисленный размер; тип валюты на самом деле делает очень хорошо для больших количеств (но остерегайтесь любых региональных проблем). Посмотрите редактирования ниже для обсуждения Int64.

Согласно документации MSDN относительно IsNumeric:

  • IsNumeric возвращает True, если тип данных Выражения является булевской переменной, Байтом, Десятичным числом, дважды, Целым числом, Долго, SByte, Коротким, Единственным, UInteger, ULong, или UShort или Объект, который содержит один из тех числовых типов. Это также возвращает True, если Выражением является Символ или Строка, которая может быть успешно преобразована в число.

  • IsNumeric возвращает False, если Выражение имеет Дату типа данных или Объекта типа данных, и он не содержит числовой тип. IsNumeric возвращает False, если Выражением является Символ или Строка, которая не может быть преобразована в число.

Так как Вы получаете Несоответствие типов, возможно, Двойное вмешивается в преобразование. IsNumeric не гарантирует, что это - Целое число, просто что это соответствует одной из числовых возможностей. Если число является двойным, возможно, региональные настройки (запятая по сравнению с периодом и так далее) вызывают исключение.

Вы могли бы попытаться преобразовать его в двойное и затем в целое число.

' Using a couple of steps
Dim iValue As Integer
Dim dValue As Double
dValue = CDbl(SourceValue)
iValue = CInt(iValue)
' Or in one step (might make debugging harder)
iValue = CInt(CDbl(SourceValue))

Править: После Вашего разъяснения кажется, что Вы получаете водосливное преобразование. Сначала попытайтесь использовать Длинное и CLng () вместо CInt (). Существует все еще шанс, запись является Int64, хотя, который является более трудным использованием VB6.

Я использовал следующий код для LARGE_INTEGER и типов Integer8 (оба Int64), но он не может работать на Вашу ситуацию:

testValue = CCur((inputValue.HighPart * 2 ^ 32) + _
                  inputValue.LowPart) / CCur(-864000000000)

Этот пример был от примера истечения пароля LDAP, но как я сказал, что он может или не может работать в Вашем сценарии. Если у Вас нет типа LARGE_INTEGER, он похож:

Private Type LARGE_INTEGER
    LowPart As Long
    HighPart As Long
End Type

Поиск LARGE_INTEGER и VB6 для получения дополнительной информации.

Править: Для отладки может быть полезно временно избежать обработки ошибок и затем снова включить его после передачи строк беспокойства:

If IsNumeric(strMaxAlternatives) And strMaxAlternatives <> "" Then
    On Error Resume Next
    iGlobalMaxAlternatives = CInt(strMaxAlternatives)
    If Err.Number <> 0 Then
        Debug.Print "Conversion Error: " & strMaxAlternatives & _
                    " - " & Err.Description
    EndIf
    On Error Goto YourPreviousErrorHandler
End If
6
ответ дан 13 December 2019 в 05:43
поделиться

VB6 не обеспечивает хорошие методы гарантировать, что CInt не перестанет работать. Я нашел, что самый простой путь состоит в том, чтобы просто использовать обработку ошибок.

function TryParse(byval text as string, byref value as integer) as boolean
  on error resume next
  value = CInt(text)
  TryParse = (err.number = 0)
endfunction

Конечно, Ваши предпочтения обработки ошибок могут варьироваться.

2
ответ дан 13 December 2019 в 05:43
поделиться

Да, "3.41" было бы числовым, но не целое число.

3
ответ дан 13 December 2019 в 05:43
поделиться

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

0
ответ дан 13 December 2019 в 05:43
поделиться

Да. Попробуйте это:

If IsNumeric("65537") Then
    Dim i As Integer
    i = CInt("65537") 'throws an error on this line!
End If

Это переполнение, но я думаю, что оно иллюстрирует ненадежность IsNumeric () в целом (специально для ints - для, удваивается, это намного более надежно).

1
ответ дан 13 December 2019 в 05:43
поделиться

IsNumeric возвратит true, если он может преобразовать строку в число. Даже если существуют нечисловые символы в строке. Я всегда цикл, хотя строка один символ за один раз и тест каждый символ. Если один символ перестал работать затем, я могу возвратить ошибку.

0
ответ дан 13 December 2019 в 05:43
поделиться

Следующий код работает без ошибки Несоответствия типов в Visual BASIC 6

Dim I As Integer
I = CInt("3.41")

То же для этого варианта

Dim I As Integer
Dim TempS As String
TempS = "3.41"
I = CInt(TempS)

Регистрация рассматриваемого кода помогла бы ответить на Ваш вопрос. В основном существует несколько функций в VB6, которые используются для преобразования строк в число.

CInt и Международное преобразование в число, но дескриптор, округляющийся отличающийся. Прямое присвоение работает и эквивалентный использованию CInt. Howver я рекомендую продолжить использовать CInt, чтобы ясно дать понять операцию Вам и Вашим поддерживающим разработчикам в будущем.

Работы CInt над числом с запятыми как "3 041,41" Однако VB6 имеет проблему при обработке настроек региона поэтому при использовании нотации кроме стандартного американского варианта английского языка, Вы получите странные результаты и ошибки.

0
ответ дан 13 December 2019 в 05:43
поделиться

Согласно документации VB6, "IsNumeric возвращает True, если тип данных Выражения является булевской переменной, Байтом, Десятичным числом, дважды, Целым числом, Долго, SByte, Коротким, Единственным, UInteger, ULong, или UShort или Объект, который содержит один из тех числовых типов. Это также возвращает True, если Выражением является Символ или Строка, которая может быть успешно преобразована в число".

Многие из тех не могут быть преобразованы в Целое число. Например, "1.5" является числовым, но это не целое число. Так, можно преобразовать его в число, но не обязательно целое число.

1
ответ дан 13 December 2019 в 05:43
поделиться

Две опции...

Изменение

If IsNumeric(strMaxAlternatives) And strMaxAlternatives <> "" Then
    iGlobalMaxAlternatives = CInt(strMaxAlternatives)
End If

Кому:

If IsNumeric(strMaxAlternatives) And strMaxAlternatives <> "" Then
    iGlobalMaxAlternatives = CDbl(strMaxAlternatives) ' Cast to double instead'
End If

Или

If IsNumeric(strMaxAlternatives) And strMaxAlternatives <> "" Then
    If CDbl(strMaxAlternatives) Mod 1 = 0 Then ' Make sure there\'s no decimal points'
        iGlobalMaxAlternatives = CInt(strMaxAlternatives)
    End If
End If
-1
ответ дан 13 December 2019 в 05:43
поделиться

Только что нашел этот самородок. Если вы запустите следующее, то скрипт #1 вернет TRUE, но скрипт #2 & #3 выдаст ошибку:

SELECT ISNUMERIC('98,0') AS isNum   -- Fails

SELECT CONVERT(INT, '98,0')   -- Fails

SELECT CONVERT(NUMERIC(11,4), '98,0')     -- Fails
0
ответ дан 13 December 2019 в 05:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: