0

ボタン電卓を書いて​​います。コードをモデル、ビュー、コントローラーに分割しました。モデルは書式設定について何も知らず、数値のみに関係しています。すべての書式設定はビューで行われます。モデルはキー押下として入力を取得し、各キー押下は列挙型の一部です:

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と、ビューは内部フォーマッタを使用して表示用の文字列を作成します。入力例:

入力 | ディスプレイ | モード
------+---------+------------
0 | 0 | 文字列から
0. | 0. | 文字列から
0.0 | 0.0 | 文字列から
0.0+ | 0 | 番号から

これは醜いです。(1) 電卓は、その入力バッファと状態を公開する必要があります。(2) ビューはその表示を公開し、文字列を使用してその内容を直接設定できるようにする必要があります。(3) 電卓の入力バッファから取得した文字列をフォーマットするために、フォーマット コードの一部を複製する必要があります。ユーザー12345.000が を入力した場合、表示12,345.000する必要があるため、文字列のコミフィケーション コードが必要です。うん。

4

2 に答える 2

1

私の電卓 (HP48SX) では、表示される数値は、数値を表示するための設定に従ってフォーマットされます。現在、0.00(またはその変形)を入力すると、 として表示され0.0000ます。おそらく、内部数値表現から表示 (つまり、書式設定) を分離できますか? MVCに関しては、これはCの状態として実装されると思います.

OPのコメントに応じて編集します。あなたがボタン計算機と呼んでいるものの制限を完全には理解していないので、あなたは自分でそこにいます. 分離に関しては、次のように電卓を設計します。

  • モデルは常に、浮動小数点数、倍精度浮動小数点数、小数、What-have-you など、数値を表すために使用するものすべてを処理します。
  • ビューは常に、数値を適切に表示し、ユーザーが望むように入力できるようにする文字列を操作します。
  • コントローラーは、文字列から数値、数値から文字列に変換します。私の最初の提案では、コントローラー自体がステートフル (たとえば、現在の数値形式を格納する) であり、ボタンからアドレス指定できると想定していました。しかし、あなたはそれを否定したようです。

私が見ているように、あなたの問題は、この状態をどこかに保存しないと、入力された数値を表示するために固定*形式以外を使用するよう電卓に指示する方法がないことです。固定* とは、12 桁などの絶対的な固定ではなく、最後に入力された数値の 10 進数の桁数を常に表示するなど、非常に限られた形式の柔軟性を意味します。

于 2010-04-15T15:02:17.657 に答える
0

最後に、より良い解決策を見つけました。inputHintビューの出力フォーマットを処理するフォーマッタ オブジェクトにプロパティを追加しました。この入力ヒントは、電卓の入力バッファーの値を受け取り、書式設定に影響を与えます。入力ヒントに小数点がある場合、フォーマッタは常に小数点を出力に保持するように強制されるため、"0."としてフォーマットされるケースが解決され"0"ます。また、入力に一部の小数桁が含まれている場合、フォーマッタは強制的に同じ数の小数桁を出力に保持します ("0.00"としてフォーマットされるケースを解決します"0")。

電卓の入力バッファーと状態を公開する必要はありますが、ビューの表示を文字列として公開する必要はなく、文字列の書式設定コード パスの重複を維持する必要もありません。

于 2010-04-16T07:24:29.463 に答える