Справочник языка
Функция ISNUMERIC
Перед преобразованием текста в число полезно убедиться, что он содержит число целиком: VAL читает только числовое начало строки и в остальных случаях возвращает 0. Такую проверку выполняет ISNUMERIC — она читает всю строку и сообщает, представима ли она числом типа DOUBLE. Исходная строка не изменяется, результат имеет тип BOOLEAN.
Синтаксис
ISNUMERIC(<текст>)Аргумент
Аргументом служит строковое выражение типа STRING: литерал вроде "12.5" или строковая переменная. Число вместо строки не подходит, поэтому вызов ISNUMERIC(12.5) отклоняется ещё при проверке программы.
Возвращаемое значение
Результат относится ко всей строке, а не к её началу:
TRUE— если строку целиком можно прочитать как число типа DOUBLE. Допустимые пробельные символы в начале и конце строки не учитываются.FALSE— если строка пуста, содержит недопустимые символы или число слишком велико для типа DOUBLE.
Проверяется вся строка, поэтому ISNUMERIC("12abc") возвращает FALSE, хотя функция VAL("12abc") возвращает 12: VAL умеет читать число в начале строки.
Правила записи числа
Запись числа состоит из необязательного знака + или -, цифр от 0 до 9 и точки для дробной части. Экспоненциальная форма тоже допустима: "1e3" обозначает 1000, а вместо e можно написать E.
Десятичным разделителем всегда служит точка, независимо от языка интерфейса и настроек системы; запятая и разделители групп разрядов не допускаются. Строки с префиксами &H и &B функция не распознаёт.
| Вызов | Результат | Причина |
|---|---|---|
ISNUMERIC("12") | TRUE | Целое число. |
ISNUMERIC("12.5") | TRUE | Дробное число с десятичной точкой. |
ISNUMERIC("-.5") | TRUE | Отрицательное число −0,5; ноль перед точкой можно опустить. |
ISNUMERIC("1e3") | TRUE | Число в экспоненциальной записи. |
ISNUMERIC(" 12 ") | TRUE | Обычные пробелы по краям допустимы. |
ISNUMERIC("") | FALSE | В строке нет числа. |
ISNUMERIC("12abc") | FALSE | После числа находятся посторонние символы. |
ISNUMERIC("12,5") | FALSE | Запятая не допускается. |
Диапазон и округление
Проверка опирается на тип DOUBLE, а он ограничен по величине. Строка "1e999" содержит слишком большое число и даёт FALSE, тогда как "1e-999" даёт TRUE: при чтении такого малого числа в DOUBLE получается ноль. Значит, TRUE не гарантирует сохранение исходной точности.
Слова "NaN", "Infinity" и "-Infinity" допустимыми числами не считаются. TRUE не обещает и того, что число поместится в INTEGER, LONG или DECIMAL: ISNUMERIC("2147483648") возвращает TRUE, хотя эта величина превышает верхнюю границу INTEGER.
Пробельные и скрытые символы
По краям строки допускаются обычный пробел U+0020 и символы U+0009–U+000D, в том числе табуляция и перевод строки. Внутри числа пробел недопустим. Прочие пробельные символы, например неразрывный пробел U+00A0, дают FALSE, а нулевой символ U+0000 недопустим в любой части строки.
Диагностика
Недопустимое содержимое строки даёт FALSE без ошибки выполнения. Ошибки компилятора относятся только к самой форме вызова:
MB2003— аргумент имеет тип, отличный от STRING. Например, вызовISNUMERIC(12)передаёт число вместо строки.MB2004— передано неверное количество аргументов. Функция принимает ровно один аргумент.
Пример
Программа проверяет строку и, если число записано в ней целиком, преобразует её функцией VAL и удваивает полученное значение.
DIM text AS STRING = "12.5"
IF ISNUMERIC(text) THEN
PRINT VAL(text) * 2
ELSE
PRINT "Введите число"
END IF
Программа выводит:
25
Если заменить "12.5" на "12abc", программа выведет Введите число.