Axiom Справочник языка

Справочник языка

Функция 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", программа выведет Введите число.

Запускаемый пример дополнительных проверок ISNUMERIC

См. также