Код для равных '=' в калькуляторе форм оракула?
У меня есть несколько кнопок от 0 до 9 и другие методы расчета, такие как плюс, минус и т. Д.
Есть два элемента отображения, Memory
а также Display
; Memory
предмет скрыт
Когда нажимаете на 1
Кнопка затем отобразить значение 1 в Display
вещь. Когда нажимаете на +
затем сохранить значение 1 в Memory
вещь. Когда нажимаете на =
кнопку затем добавить Memory
+ Display
значения и показать ответ на Display
вещь.
Вопрос в том, как закодировать множественные вычисления в равные =
кнопка?
2 ответа
У вас есть три регистра: нажатие кнопки, отображаемое значение и значение памяти. Итак, строка расчета 2+3=5
выглядит примерно так:
button Display Memory
2 2
+ 2 2
3 3 2
= 5 5
Насколько я понимаю ваш вопрос, вы хотите обрабатывать более длинные вычисления, когда пользователь печатает в несколько шагов, не нажимая =
, например 2+3+7/4*5=
, Есть несколько способов сделать это, но самый интуитивно понятный для пользователя - это рассматривать арифметические операторы как неявные =
операция, вычисление промежуточной суммы и отображение этого значения.
button Display Memory
2 2
+ 2 2
3 3 2
+ 5 5
7 7 5
/ 12 12
4 4 12
* 3 3
5 5 3
= 15 15
Чтобы это работало, вам нужен еще один элемент регистрации для отслеживания текущего оператора.
button Display Memory Operator
2 2
+ 2 2 +
3 3 2 +
+ 5 5 +
7 7 5 +
/ 12 12 /
4 4 12 /
* 3 3 *
5 5 3 *
= 15 15 =
Поэтому, когда пользователь нажимает кнопку запуска, вы выполняете что-то вроде этого:
if :operator = '+' then
:memory := :memory + :display;
elsif :operator = '-' then
:memory := :memory - :display;
elsif :operator = '/' then
:memory := :memory / :display;
elsif :operator = '*' then
:memory := :memory * :display;
end if;
:display := :memory;
:operator := :button_value;
Вам нужно будет решить, как справиться с ситуацией, когда пользователь вводит две операции подряд, например +/
, Но, вероятно, вам нужно отслеживать предыдущее нажатие кнопки тоже.
Так какова цель =
? Ну, это зависит от того, что пользователь вводит дальше. Если они следуют =
с другим оператором, то это просто промежуточный итог, и сумма продолжается....
button Display Memory
2 2
+ 2 2
3 3 2
= 5 5
+ 2 5 <-- continue with existing sum
= 7 7
... но если они следуют за ним с номером, то мы начинаем новую сумму и сбрасываем память:
button Display Memory
2 2
+ 2 2
3 3 2
= 5 5
2 2 <-- start a new sum
+ 2 2
2 2 2
= 4 4
Создайте функцию, как показано ниже.
create or replace function calculate(p_input VARCHAR2) RETURN VARCHAR2
IS
v_output VARCHAR2(20);
missing_expression EXCEPTION;
invalid_identifier EXCEPTION;
PRAGMA EXCEPTION_INIT(missing_expression, -936);
PRAGMA EXCEPTION_INIT(invalid_identifier, -904);
BEGIN
EXECUTE IMMEDIATE 'SELECT '||p_input||' FROM dual' INTO v_output;
RETURN v_output;
EXCEPTION
WHEN VALUE_ERROR OR MISSING_EXPRESSION OR INVALID_IDENTIFIER THEN
RETURN 'ERROR';
END;
/
Пример использования в SQL,
SELECT CAST(CALCULATE('1+2-3+4+5') AS VARCHAR2(20)) output
FROM dual;
В формах Oracle,
:block.io_display_item := CAST(CALCULATE(:block.io_display_item) AS VARCHAR2(20));