「5*5」のようなテキスト フィールドに入力できる方法があるかどうか知りたいです。
そして入力時に、ドキュメントはデータベースを取得し、25 を返すことができます。
テキストフィールドに入力するコンテンツは である必要があり、コンバーターString
を使用するとシステムが混乱するという事実のために、私はかなり混乱しています。Number()
(正規表現を使用して)演算子で文字列を分割してから、それらの演算子を保持する必要があります。
私にはこれを自分で行う忍耐力はありませんが、特定の操作(加算前の乗算など)にも優先順位を付ける必要があります。
私はあなたが始めるためにいくつかのコードを作成しました-それは現在の形式の本当に単純なアルゴリズムでのみ機能することに注意してください:
// Finds +, - and *.
var operators:RegExp = /\+|\-|\*/g;
var numbers:RegExp = /\d+/g;
/**
* Attempts to work with a mathematical formula provided as string.
* @param str Subject string.
*/
function work(str:String):Number
{
var ops:Array = str.match(operators); // List of operators in order.
var nums:Array = str.match(numbers); // List of numbers in order.
var command:Array = [];
var cmbLen:int = Math.max(ops.length, nums.length);
for(var i:int = 0; i < cmbLen; i++)
{
if(nums[i]) command.push(nums[i]);
if(ops[i]) command.push(ops[i]);
}
// Begin performing the command.
var val:Number = 0;
var queuedOperator:String = "";
for(i = 0; i < command.length; i++)
{
// Apply initial value;
if(i == 0)
val = Number(command[i]);
// Work.
if(i % 2 == 0)
{
var num:Number = Number(command[i]);
// Operate if required.
if(queuedOperator.length > 0)
{
switch(queuedOperator)
{
case "+": val += num; break;
case "-": val -= num; break;
case "*": val *= num; break;
}
}
queuedOperator = command[i + 1] as String || "";
}
}
return val;
}
そしていくつかのテスト:
trace(work("7 + 10")); // 17
trace(work("5 * 5")); // 25
trace(work("12 - 4")); // 8
trace(work("10 + 5 + 1")); // 16
これに基づいて、より多くの演算子を含めて(それらをに追加するだけで) 、優先度の順にoperators
並べ替えてください。かっこをcommand
追加すると面白くなり始めますが、時間が経つにつれて正しく機能するようになると確信しています。()