Очень простой, но эффективный метод, который я использую, когда мне нужен ненулевой числовой ввод, — это следующий код (обратите внимание, что впоследствии он проверяет ввод пользователя):
:RETRY_RESET
rem /* Since zero is considered as invalid, preset variable to `0` to
rem not keep the former value in case the user just presses ENTER;
rem you could also define a non-zero default value here optionally: */
set /A NUMBER=0
:RETRY_REUSE
rem // Display prompt now:
set /P NUMBER="Please enter a positive number: "
rem /* Convert entry to a numeric value; everything up to the first
rem numeral is converted to a numeric value, except leading SPACEs
rem or TABs are ignored and signs `+` and `-` are recognised: */
set /A NUMBER+=0
rem /* Caution: numbers with leading `0` are converted to octal ones!
rem since `8` and `9` are not valid octal numerals, entries with
rem such figures and leading zeros are converted to `0`! */
rem // Verify entry:
if %NUMBER% EQU 0 goto :RETRY_RESET
rem // Do something with `%NUMBER%` at this point...
rem /* Afterwards you can jump to `:RETRY_RESET` to enter another number;
rem alternatively, jump to `:RETRY_REUSE` to maintain the former entry
rem in case the user just presses ENTER... */
Это не приведет к ошибке для любой записи, о которой вы можете подумать, потому что переменная NUMBER
, содержащая значение, никогда не расширяется до того, как она будет преобразована в истинное число с помощью set /A NUMBER+=0
.
Скрипт правильно распознает знаки +
и -
. Начальные пробелы игнорируются. Помимо всего этого, все до первой нечисловой цифры преобразуется в число; так, например, запись типа SPACE+15.75k
преобразуется в 15
, поскольку .
не является числом.
Недостатком этого подхода является то, что ведущие нули могут привести к неожиданным результатам, поскольку set /A
интерпретирует числа, например, восьмеричные; так, например, 012
преобразуется в (десятичное) 10
, а 08
и 09
преобразуются в 0
, поскольку 8
и 9
не являются допустимыми восьмеричными цифрами.
Хорошим моментом может быть тот факт, что шестнадцатеричные числа распознаются правильно в случае они имеют префикс 0x
; например, 0x18
преобразуется в 24
; 0xAS
становится 10
(поскольку S
не шестнадцатеричный).
07.07.2016
0
для чисел от2
до9
необязательно показалось бы мне более удобным, но в любом случае отличный подход! 08.07.2016