RU

Работа функции ISNUM

Nex Moderator 04.06.2012 09:54 4 comments 5925 views

Цитирую описание функции ISNUM из справки. Далее цитата.

ISNUM([$выражение]) - функция проверяет, все ли символы в строке являются цифрами (учитывая знак “-” в начале, прилегающие пробелы и символы табуляции). Если в указанной строке есть хотя бы один символ - не-цифра (исключая возможный “-” в начале и прилегающие пробелы / символы табуляции), то функция возвращает 0 (ложь), иначе -1 (истина).
Функция полезна при проверке введённой играющим строки на число. Примеры:

ISNUM('9999 ') равно -1
ISNUM(' -888') равно -1
ISNUM('777a6') равно 0

Конец цитаты.

Проблема возникает, когда требуется проверить отдельный символ на условие “цифра или нет”. Функция вернет TRUE для строк ’ ’(пробел), ‘-’(минус), а также ‘’(пустая строка). Формально функция работает корректно, т.к. эти символы являются “исключениями”, но по смыслу и по названию некорректно, т.к. эти строки без цифр не могут считаться числом.

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

Edited at 04.06.2012 09:55 (13 years ago)

Для пустой строки так и должно возвращать -1, для “-” точно надо поправить.

Byte,
но пустая строка не является ни числом, ни цифрой. Это противоречит здравому смыслу.
Я ввожу текст:

:inp
$a = $INPUT('Введите число')
IF NO ISNUM($a):
    JUMP 'inp'
END

Проверка “пропустит” пустые и пробельные строки, а ведь мне требовалось именно число. “ISNUM” означает “is number”, “является числом”, а вовсе не “приводится к числовому значению”. Нынешнее поведение функции приводит к избыточным проверкам и скрытым багам.

В общем-то да, наверно сделаю проверку на валидность именно как числа.
Осталось найти время на обновление.

Byte,
cпасибо!

Log in or Register to post comments.