Пишу кнопочный калькулятор. У меня есть код, разделенный на модель, представление и контроллер. Модель ничего не знает о форматировании, она касается только чисел. Все форматирование выполняется в представлении. Модель получает свои данные в виде нажатий клавиш, каждое нажатие клавиши является частью перечисления:
typedef enum {
kButtonUnknown = 0,
kButtonMemoryClear = 100,
kButtonMemoryPlus = 112,
kButtonMemoryMinus = 109,
kButtonMemoryRecall = 114,
kButtonClear = 99,
…
};
Когда пользователь нажимает кнопку (скажем, 1 ), модель получает код кнопки (kButtonNum1
), добавляет соответствующий номер в буфер ввода строки ("1"
) и обновляет числовой выходное значение (1.0
). Затем контроллер передает числовое выходное значение представлению, которое его форматирует (1
).
Это все просто, просто и чисто, но на самом деле не работает. Проблема заключается в том, что, когда пользователь вводит часть числа (скажем, 0.00
, собираясь ввести 0.001
), ввод не сохраняется в процессе просмотра модели, и на дисплее отображается 0
вместо 0.00
. Я знаю, почему это происходит ("0.00"::string
анализирует 0::double
, и это форматируется как 0
). Чего я не знаю, так это как разработать калькулятор, чтобы код оставался чистым и простым, а цифры отображались на экране в точности так, как их набирает пользователь.
Я уже пришел с каким-то решением, но это, по сути, хак и нарушает красивый и простой поток от модели калькулятора к дисплею.
Идеи
Текущее решение отслеживает состояние калькулятора. Если калькулятор строит число, я беру входной буфер калькулятора (строку) и непосредственно устанавливаю содержимое дисплея (также строку). В противном случае я выбираю правильный путь, т.е. возьмите вывод числового калькулятора, передайте его представлению как double
, и представление использует свой внутренний форматер для создания строки для отображения. Пример ввода:
input | display | mode
------+---------+------------
0 | 0 | from string
0. | 0. | from string
0.0 | 0.0 | from string
0.0+ | 0 | from number
Это безобразно. (1) Калькулятор должен выставить свой входной буфер и состояние. (2) Представление должно отображать свое отображение и позволять устанавливать его содержимое напрямую, используя строку. (3) Мне нужно продублировать часть кода форматирования, чтобы отформатировать строку, полученную из входного буфера калькулятора. Если пользователь вводит 12345.000
, мне нужно отобразить 12,345.000
, и поэтому у меня должен быть код исправления для строк. Тьфу.