我正在写一个按钮计算器。我将代码分为模型、视图和控制器。该模型对格式一无所知,它只关心数字。所有格式都在视图中完成。该模型将其输入作为按键,每个按键都是枚举的一部分:
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
)。我不知道如何设计计算器,以使代码保持简洁,并且数字将在用户键入时完全显示在屏幕上。
我已经提出了某种解决方案,但这本质上是一种 hack,打破了从计算器模型到显示器的美丽而简单的流程。
想法?
当前解决方案跟踪计算器状态。如果计算器正在构建一个数字,我将计算器输入缓冲区(一个字符串)并直接设置显示内容(也是一个字符串)。否则我会走正确的道路,即。获取数字计算器输出,将其作为 a 传递给视图,double
然后视图使用其内部格式化程序为显示创建一个字符串。示例输入:
输入 | 展示 | 模式 ------+----------+------------ 0 | 0 | 从字符串 0。| 0。| 从字符串 0.0 | 0.0 | 从字符串 0.0+ | 0 | 从号码
这很丑陋。(1) 计算器必须公开其输入缓冲区和状态。(2) 视图必须公开其显示并允许直接使用字符串设置其内容。(3) 我必须复制一些格式化代码来格式化从计算器输入缓冲区得到的字符串。如果用户输入12345.000
,我必须显示12,345.000
,因此我必须有一个字符串的commification 代码。呸。