我想知道他們的方式,你可以鍵入一個文本字段,如「5 * 5」。在Textfield中輸入一個公式並處理它? [動作3.0]
,然後回車,該文件將採取的數據庫,並能夠回到25
我很困惑,由於這樣的事實內容,你輸入到文本框必須是String
,當你使用系統變得混亂。
我想知道他們的方式,你可以鍵入一個文本字段,如「5 * 5」。在Textfield中輸入一個公式並處理它? [動作3.0]
,然後回車,該文件將採取的數據庫,並能夠回到25
我很困惑,由於這樣的事實內容,你輸入到文本框必須是String
,當你使用系統變得混亂。
你需要打破你的字符串在運營商(使用正則表達式),然後保持這些運營商。
我沒有耐心去做這件事,但你需要優先考慮某些操作(加法之前的乘法等)。
我已經做了一些代碼,讓你開始 - 注意,只有在其目前的形式很簡單的算法原理:
// 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
。添加()
括號會開始變得有趣,但隨着時間的推移,我確信可以正確地工作。
這是另一個使用RegExp的解決方案。這可以使用以下符號計算整數和小數:^
,%
, /
,*
,+
,-
。您也可以使用禁忌物,例如2^(10/(2+3-2))
。
您需要選擇禁用快捷鍵,從控制菜單選項時,在測試影片模式看到的結果。
import flash.text.TextField;
import flash.text.TextFieldType;
import flash.text.TextFormat;
import flash.text.TextFieldAutoSize;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
var tf:TextField = new TextField();
tf.addEventListener(KeyboardEvent.KEY_DOWN,tfKeyDown);
tf.defaultTextFormat = new TextFormat('_sans',24);
tf.autoSize = TextFieldAutoSize.LEFT;
tf.wordWrap = true;
tf.type = TextFieldType.INPUT;
tf.border = true;
tf.x = (stage.stageWidth - 300) * .5;
tf.y = 100;
tf.width = 200;
addChild(tf);
stage.focus = tf;
function tfKeyDown(e:KeyboardEvent):void {
if (e.keyCode == Keyboard.ENTER) {
e.preventDefault();
trace('Input:',tf.text);
trace('Result:',calculate(tf.text,7));
trace('-----------------------');
}
}
function calculate(str:String,maxDecimalCount:int=int.MAX_VALUE):Number {
var num:String = '-?[0-9]*\\.?[0-9]+';
var numRX:RegExp = new RegExp(num,'g');
var rx:RegExp, i:int;
// normalize minuses and eliminate spaces
str = str.replace(/--/g,'+').replace(/\s/g,'');
// calculate parenthesized equations
while (/\(([^\(\)]+)\)/.test(str)) {
str = str.replace(/\(([^\(\)]+)\)/g,function() {
return calculate(String(arguments[1]),int.MAX_VALUE).toString();
});
}
// exponential --> x^y
rx = new RegExp(num+'(\\^'+num+')+','g');
str = str.replace(rx,function() {
var nums = String(arguments[0]).match(numRX);
var res:Number = Math.pow(Number(nums[0]),Number(nums[1]));
for (i = 2; i < nums.length; i++) res = Math.pow(res,Number(nums[i]));
//trace('^ ['+nums+'] =',res);
return res;
});
// modulus --> x%y
rx = new RegExp(num+'(%'+num+')+','g');
str = str.replace(rx,function() {
var nums = String(arguments[0]).match(numRX);
var res:Number = Number(nums[0]);
for (i = 1; i < nums.length; i++) res %= Number(nums[i]);
//trace('% ['+nums+'] =',res);
return res;
});
// divide --> x/y
rx = new RegExp(num+'(/'+num+')+','g');
str = str.replace(rx,function() {
var nums = String(arguments[0]).match(numRX);
var res:Number = Number(nums[0]);
for (i = 1; i < nums.length; i++) res /= Number(nums[i]);
//trace('/ ['+nums+'] =',res);
return res;
});
// multiply --> x*y
rx = new RegExp(num+'(\\*'+num+')+','g');
str = str.replace(rx,function() {
var nums = String(arguments[0]).match(numRX);
var res:Number = Number(nums[0]);
for (i = 1; i < nums.length; i++) res *= Number(nums[i]);
//trace('* ['+nums+'] =',res);
return res;
});
// add or subtract --> x+y or x-y
rx = new RegExp(num+'([\\+\\-]'+num+')+','g');
str = str.replace(rx,function() {
var nums = String(arguments[0]).match(numRX);
var res:Number = Number(nums[0]);
for (i = 1; i < nums.length; i++) res += Number(nums[i]);
//trace('+- ['+nums+'] =',res);
return res;
});
var res:Number = Number(str);
// if the result is not a number...
if (isNaN(res)) {
throw new Error('Please input a valid equation using numbers and the following signs:()^%/*+-');
}
// if the remainder needs to be shortened...
if (maxDecimalCount < int.MAX_VALUE &&
int(res) != res && String(res).split('.')[1].length > maxDecimalCount) {
res = Math.round(res * Math.pow(10,maxDecimalCount))/Math.pow(10,maxDecimalCount);
}
return res;
}
雖然我不確定模數和指數應該在哪裏。這可能需要改變。 – inhan 2012-04-05 12:48:11
您可以解析字符串並查找運算符(如+ - *和/),然後對這些運算符兩邊的數字執行正確的操作。 – 2012-04-04 00:11:41