2012-04-03 23 views
1

我想知道他們的方式,你可以鍵入一個文本字段,如「5 * 5」。在Textfield中輸入一個公式並處理它? [動作3.0]

,然後回車,該文件將採取的數據庫,並能夠回到25

我很困惑,由於這樣的事實內容,你輸入到文本框必須是String,當你使用系統變得混亂。

+0

您可以解析字符串並查找運算符(如+ - *和/),然後對這些運算符兩邊的數字執行正確的操作。 – 2012-04-04 00:11:41

回答

1

你需要打破你的字符串在運營商(使用正則表達式),然後保持這些運營商。

我沒有耐心去做這件事,但你需要優先考慮某些操作(加法之前的乘法等)。

我已經做了一些代碼,讓你開始 - 注意,只有在其目前的形式很簡單的算法原理:

// 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。添加()括號會開始變得有趣,但隨着時間的推移,我確信可以正確地工作。

0

這是另一個使用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; 

} 
+0

雖然我不確定模數和指數應該在哪裏。這可能需要改變。 – inhan 2012-04-05 12:48:11

相關問題