Как вводить только целые числа в REXX. В моей программе удается избегать некоторых записей, но когда число содержит такие символы, как запятая, процент, шифр и другие, это приводит к остановке программы. Как проверить эти операции и позволить программе работать только с целочисленным вводом.
do forever
call charout, "Enter number: "
pull NumInt
say
if (NumInt\== '') then
do
if (datatype(value(NumInt), 'W')) then
leave
else
do
say "Error: Enter only whole number."
say
end
end
else
do
say "Error: <Enter> key accidentally triggered."
say
end
end
say "Valid input provided: " || NumeroInteiro
say
call charout, "Press <Enter> to finish... "
pull
exit



Я думаю, вы хотите добиться того, чтобы разрешить некоторые символы, которые не являются числовыми.... как насчет удаления всех символов, которые действительны, но не числовых, перед проверкой типа данных, например (я предполагаю, что пробел действителен) :
translatetable = ",.%$£-" /* valid characters */
if (NumInt\== '') then
x = space(translate(NumInt,' ',translatetable),0)
if (datatype(value(x), 'W')) then
etc etc
Судя по структуре вашей программы, я считаю, что вам нужно что-то вроде:
charSpecial: procedure
arg String
Char = "!@#$%^&*()-_=+[]{}|;:',<>/?`~" || '"'
do i = 1 to length(Char)
if pos(substr(Char, i, 1), String) > 0 then
return 1
end
return 0
Посмотрите использование этого в коде:
do forever
call charout, "Enter number: "
pull NumInt
say
if (NumInt \== '') then
do
if (charSpecial(NumInt)) then
do
say "Error: Special character not allowed."
say
end
else
if (datatype(value(NumInt), 'W')) then
leave
else
do
say "Error: Enter only whole number."
say
end
end
else
do
say "Error: <Enter> key accidentally triggered."
say
end
end
say "Valid input provided: " || NumInt
say
call charout, "Press <Enter> to finish... "
pull
exit
Идиома Rexx для этого — функция
verify(). Подробности см. на сайте ibm.com/docs/en/zos/3.1.0?topic=functions-verify.