这是我做的一个,模仿Windows自带的计算器,支持快捷键,进制转换。尤其是按运算法则运算(到现在,我也没见过这么好的Flash计算器,支持一下啦!
我的计算器类:
dynamic class Counter { //输出的文字,是格式化了的,例如分组,科学记数法... var output:String = "0"; //计算的文字,纯数字 var value:String = "0"; //是否分组 var grouping:Boolean = false; //监听器用 var _listeners:Array = []; //统计用 var data:Array = undefined; var datas:Object = {Ave:undefined, Ave2:undefined, Sum:undefined, Sum2:undefined, S:undefined, S2:undefined}; //算式储存 private var count:Array = []; //是否重新输入数字 private var isnew:Boolean = false; //储存数字 private var remember:Number = undefined; //暂时数字储存 private var nrem:String; //暂时运算符储存 private var nsign:String = undefined; //数制 private var systems:Number = 10; //单位 private var units:Number = 0; //括号中的 private var inbracket:Array = []; //构造函数 function Counter(key:Boolean) { if (key == undefined) { key = true; } if (key) { Key.addListener(this); } } //清除键 function C() { //清除所有数据 value = "0"; count = []; isnew = true; nsign = undefined; CounterMessage("C"); } //清空键 function CE() { value = "0"; isnew = true; CounterMessage("CE"); } //BackSpace function BackSpace() { value = value.slice(0, -1); if (value.length == 0) { value = "0"; } CounterMessage("BackSpace"); } //输入数字 function numbers(n) { n = n.toString().toUpperCase(); if (isnew) { value = "0"; } isnew = false; //判断输入的数字是否在数制范围内 if (systems<=10) { if (n.charCodeAt(0)<=47+systems) { if (value != "0") { value += n; } else { value = n; } CounterMessage(n); } } else if (systems>10 && systems<=36) { if (n.charCodeAt(0)<=54+systems) { if (value != "0") { value += n; } else { value = n; } CounterMessage(n); } } } //小数点 function dot() { if (systems == 10) { if (isnew) { value = output="0"; } isnew = false; if (value.indexOf(".") == -1) { value += "."; } CounterMessage("."); } } //正负号 function minuss() { if (systems == 10) { if (isnew) { value = "0"; } isnew = false; if (value != "0") { if (value.indexOf("-") == -1) { value = "-"+value; } else { value = value.substr(1); } } CounterMessage("+/-"); } } //+ function plus() { duseless(); if (count[count.length-1] == "+" || count[count.length-1] == "-" || count[count.length-1] == "%") { if (systems == 10) { count.push(value); } else { count.push(parseInt(value, systems).toString()); } } else if (count.length == 0) { if (systems == 10) { count.push(value); } else { count.push(parseInt(value, systems).toString()); } } else { //if(count[count.length-1].substr(-1,1)=="*"||count[count.length-1].substr(-1,1)=="/"){ //count[count.length-1]=count[count.length-1].slice(0,-1) //} if (systems == 10) { count[count.length-1] += value; } else { count[count.length-1] += parseInt(value, systems).toString(); } } count.push("+"); nsign = "+"; value = calculate(); isnew = true; CounterMessage("+"); } //- function minus() { duseless(); if (count[count.length-1] == "+" || count[count.length-1] == "-" || count[count.length-1] == "%") { if (systems == 10) { count.push(value); } else { count.push(parseInt(value, systems).toString()); } } else if (count.length == 0) { if (systems == 10) { count.push(value); } else { count.push(parseInt(value, systems).toString()); } } else { //if(count[count.length-1].substr(-1,1)=="*"||count[count.length-1].substr(-1,1)=="/"){ //count[count.length-1]=count[count.length-1].slice(0,-1) //} if (systems == 10) { count[count.length-1] += value; } else { count[count.length-1] += parseInt(value, systems).toString(); } } count.push("-"); nsign = "-"; value = calculate(); isnew = true; CounterMessage("-"); } //* function multiply() { duseless(); if (count[count.length-1] == "+" || count[count.length-1] == "-" || count[count.length-1] == "%") { if (systems == 10) { count.push(value); } else { count.push(parseInt(value, systems).toString()); } } else if (count.length == 0) { if (systems == 10) { count.push(value); } else { count.push(parseInt(value, systems).toString()); } } else { //if(count[count.length-1].substr(-1,1)=="*"||count[count.length-1].substr(-1,1)=="/"){ //count[count.length-1]=count[count.length-1].slice(0,-1) //} if (systems == 10) { count[count.length-1] += value; } else { count[count.length-1] += (parseInt(value, systems).toString()); } } count[count.length-1] += "*"; nsign = "*"; value = calculate(); isnew = true; CounterMessage("*"); } // / function except() { duseless(); if (count[count.length-1] == "+" || count[count.length-1] == "-" || count[count.length-1] == "%") { if (systems == 10) { count.push(value); } else { count.push(parseInt(value, systems).toString()); } } else if (count.length == 0) { if (systems == 10) { count.push(value); } else { count.push(parseInt(value, systems).toString()); } } else { //if(count[count.length-1].substr(-1,1)=="*"||count[count.length-1].substr(-1,1)=="/"){ //count[count.length-1]=count[count.length-1].slice(0,-1) //} if (systems == 10) { count[count.length-1] += value; } else { count[count.length-1] += (parseInt(value, systems).toString()); } } count[count.length-1] += "/"; nsign = "/"; value = calculate(); isnew = true; CounterMessage("/"); } // = function equal() { duseless(); if (count[count.length-1] == "+" || count[count.length-1] == "-" || count[count.length-1] == "%") { if (systems == 10) { count.push(value); } else { count.push(parseInt(value, systems).toString()); } nrem = value; } else if (count.length == 0) { if (systems == 10) { count.push(value); } else { count.push(parseInt(value, systems).toString()); } nrem = value; } else { if (count[count.length-1].substr(-1, 1) == "*" || count[count.length-1].substr(-1, 1) == "/" || count[count.length-1].substr(-1, 1) == "^") { if (systems == 10) { count[count.length-1] += value; } else { count[count.length-1] += parseInt(value, systems).toString(); } nrem = value; } else { //if (count[count.length-1] == "+" || count[count.length-1] == "-" || count[count.length-1] == "*" || count[count.length-1] == "/" || count[count.length-1] == "^") { //count.pop(); //} if (nsign == "+") { count.push("+"); count.push(parseInt2(nrem, systems, 10)); } else if (nsign == "-") { count.push("-"); count.push(parseInt2(nrem, systems, 10)); } else if (nsign == "%") { count.push("%"); count.push(parseInt2(nrem, systems, 10)); } else if (nsign == "*") { count[count.length-1] += ("*"+parseInt2(nrem, systems, 10)); } else if (nsign == "+") { count[count.length-1] += ("/"+parseInt2(nrem, systems, 10)); } else if (nsign == "^") { count[count.length-1] += ("^"+parseInt2(nrem, systems, 10)); } } } value = calculate(); isnew = true; CounterMessage("="); } //sqrt function sqrt() { duseless(); if (systems == 10) { value = Math.sqrt(Number(value)).toString(); } else { value = Math.sqrt(parseInt(value, systems)).toString(systems).toUpperCase(); } isnew = true; CounterMessage("sqrt"); } //取模 function Mod() { duseless(); if (count[count.length-1] == "+" || count[count.length-1] == "-" || count[count.length-1] == "%") { if (systems == 10) { count.push(value); } else { count.push(parseInt(value, systems).toString()); } } else if (count.length == 0) { if (systems == 10) { count.push(value); } else { count.push(parseInt(value, systems).toString()); } } else { //if(count[count.length-1].substr(-1,1)=="*"||count[count.length-1].substr(-1,1)=="/"){ //count[count.length-1]=count[count.length-1].slice(0,-1) //} if (systems == 10) { count[count.length-1] += value; } else { count[count.length-1] += parseInt(value, systems).toString(); } } count.push("%"); nsign = "%"; value = calculate(); isnew = true; CounterMessage("Mod"); } //x^y function pow() { duseless(); if (count[count.length-1] == "+" || count[count.length-1] == "-" || count[count.length-1] == "%") { if (systems == 10) { count.push(value); } else { count.push(parseInt(value, systems).toString()); } } else if (count.length == 0) { if (systems == 10) { count.push(value); } else { count.push(parseInt(value, systems).toString()); } } else { if (systems == 10) { count[count.length-1] += value; } else { count[count.length-1] += (parseInt(value, systems).toString()); } } count[count.length-1] += "^"; nsign = "^"; value = calculate(); isnew = true; CounterMessage("x^y"); } //x^3 function pow3() { duseless(); if (systems == 10) { value = Math.pow(Number(value), 3).toString(); } else { value = Math.pow(parseInt(value, systems), 3).toString(systems).toUpperCase(); } isnew = true; CounterMessage("x^3"); } //x^2 function pow2() { duseless(); if (systems == 10) { value = Math.pow(Number(value), 2).toString(); } else { value = Math.pow(parseInt(value, systems), 2).toString(systems).toUpperCase(); } isnew = true; CounterMessage("x^2"); } //% function percent() { if (systems == 10) { duseless(); if (count[count.length-1] == "+" || count[count.length-1] == "-") { count.push((Number(value)/100).toString()); } else if (count.length == 0) { count.push((Number(value)/100).toString()); } else { count[count.length-1] += ((Number(value)/100).toString()); } value = calculate(); isnew = true; CounterMessage("%"); } } // 1/x function reciprocal() { duseless(); if (systems == 10) { value = (1/Number(value)).toString(); } else { value = (1/parseInt(value, systems)).toString(systems).toUpperCase(); } isnew = true; CounterMessage("1/x"); } //化成科学记数法 function FtoE() { if (systems == 10) { duseless(); if (value.indexOf("e") == -1) { value = ChangetoE(Number(value)); } else { value = ChangetoF(Number(value)); } CounterMessage("F-E"); } } // 阶乘 function factorial() { if (systems == 10) { var num:Number = 1; for (var i = 1; i<=Math.floor(Number(value)); i++) { num *= i; } value = num.toString(); CounterMessage("n!"); } } //三角函数 function sin() { if (systems == 10) { duseless(); if (units == 0) { value = dtr(Number(value)); } value = Math.sin(Number(value)).toString(); CounterMessage("sin"); } } function cos() { if (systems == 10) { duseless(); if (units == 0) { value = dtr(Number(value)); } value = Math.cos(Number(value)).toString(); CounterMessage("cos"); } } function tan() { if (systems == 10) { duseless(); if (units == 0) { value = dtr(Number(value)); } value = Math.tan(Number(value)).toString(); CounterMessage("tan"); } } //反三角函数 function asin() { if (systems == 10) { duseless(); value = Math.asin(Number(value)).toString(); if (units == 0) { value = rtd(Number(value)); } CounterMessage("asin"); } } function acos() { if (systems == 10) { duseless(); value = Math.acos(Number(value)).toString(); if (units == 0) { value = rtd(Number(value)); } CounterMessage("acos"); } } function atan() { if (systems == 10) { duseless(); value = Math.atan(Number(value)).toString(); if (units == 0) { value = rtd(Number(value)); } CounterMessage("atan"); } } //左括弧 function leftBracket() { duseless(); if ((st=count[count.length-1].substr(-1, 1)) == "*" || st == "/" || st == "^" || (st=count[count.length-1]) == "+" || st == "-") { inbracket.push({count:count}); value = "0"; count = []; CounterMessage("("); } } //右括弧 function rightBracket() { if (inbracket.length != 0) { duseless(); if (count[count.length-1] == "+" || count[count.length-1] == "-") { if (systems == 10) { count.push(value); } else { if (systems == 10) { count.push(value); } else { count.push(parseInt(value, systems).toString()); } } } else if (count.length == 0) { if (systems == 10) { if (systems == 10) { count.push(value); } else { count.push(parseInt(value, systems).toString()); } } else { count.push(value); } } else if (count[count.length-1].substr(-1, 1) == "*" || count[count.length-1].substr(-1, 1) == "/" || count[count.length-1].substr(-1, 1) == "^") { if (systems == 10) { count[count.length-1] += value; } else { count[count.length-1] += parseInt(value, systems).toString(); } } value = calculate(); isnew = true; count = inbracket[inbracket.length-1].count; inbracket.pop(); CounterMessage(")"); } } //取整 function int() { if (systems == 10) { duseless(); value = Math.floor(Number(value)).toString(); CounterMessage("int"); } } //显示小数部分 function aint() { if (systems == 10) { duseless(); value = (Number(value)-Math.floor(Number(value))).toString(); CounterMessage("aint"); } } //计算e的x次方 function exp() { duseless(); if (systems == 10) { value = Math.exp(Number(value)).toString(systems); } else { value = Math.exp(parseInt(value, systems)).toString(systems); } CounterMessage("exp"); } //计算10的x次方 function Exp() { duseless(); value = Math.pow(10, Number(parseInt2(value, systems, 10))).toString(systems); CounterMessage("Exp"); } //计算自然对数 function log() { duseless(); if (systems == 10) { value = Math.log(Number(value)).toString(systems); } else { value = Math.log(parseInt(value, systems)).toString(systems); } CounterMessage("log"); } //将数字化为度-分-秒 function dms() { if (systems == 10) { if ((st=value.indexOf(".")) != -1) { duseless(); var f:String = value.slice(0, st)+"."+(ss=(Number(value.substr(st+1))*60).toString()).substr(0, 2); if (ss.length>2) { value = f+(Number(ss.substr(2))*60).toString(); } else { value = f; } value = Rtrim(value, "0"); CounterMessage("dms"); } } } //将数字化为度 function adms() { if (systems == 10) { if ((st=value.indexOf(".")) != -1) { duseless(); var s:Number = 0; if (value.length>=st+4) { s = Number(value.substr(st+3))/60; while (s>10) { s /= 10; } } var f:Number = (Number(value.substr(st+1, 2))+s)/60; value = (Math.floor(Number(value))+f).toString(); //value=Rtrim(value,"0") CounterMessage("adms"); } } } // 清除存储区的所有数字 function MC() { remember = undefined; isnew = true; CounterMessage("MC"); } // 输出存储区的所有数字 function MR() { if (remember == undefined) { value = "0"; } else { value = remember.toString(systems); } isnew = true; CounterMessage("MR"); } // 将数字储存在存储区 function MS() { duseless(); if (value != "0") { if (systems == 10) { remember = Number(value); } else { remember = parseInt(value, systems); } isnew = true; CounterMessage("MS"); } } // 将存储区的数字与以有数字相加 function MP() { duseless(); if (value != "0") { if (systems == 10) { remember += Number(value); } else { remember += parseInt(value, systems); } isnew = true; CounterMessage("M+"); } } //进入,退出统计模式 function Sta() { if (data == undefined) { data = []; isnew = true; CounterMessage("Sta"); } else { data = undefined; datas = {Ave:undefined, Ave2:undefined, Sum:undefined, Sum2:undefined, S:undefined, S2:undefined}; isnew = true; CounterMessage("Sta"); } } //求平均值 //Ave=(x1+x2+x3+...+xn)/xn function Ave() { if (data != undefined) { if (data.length == 0) { datas.Ave = 0; value = "0"; } else if (datas.Ave != undefined) { value = datas.Ave.toString(systems); } else { //计算Ave if (datas.Sum != undefined) { var num:Number = datas.Sum; } else { var num:Number = 0; for (var i in data) { num += data[i]; } } datas.Ave = num/data.length; value = datas.Ave.toString(systems); } isnew = true; CounterMessage("Ave"); } } //求均方值 //Ave2=Ave*Ave+S*S function Ave2() { if (data != undefined) { if (data.length == 0) { datas.Ave2 = 0; value = "0"; } else if (datas.Ave2 != undefined) { value = datas.Ave2.toString(systems); } else { //计算Ave2 if (datas.Ave == undefined) { //计算Ave if (datas.Sum != undefined) { var num:Number = datas.Sum; } else { var num:Number = 0; for (var i in data) { num += data[i]; } } datas.Ave = num/data.length; } //计算S if (datas.S == undefined) { //计算Sum2 if (datas.Sum2 == undefined) { var num2:Number = 0; for (var j in data) { num2 += data[j]*data[j]; } } datas.S = Math.sqrt((datas.Sum2-data.length*datas.Ave*datas.Ave)/data.length); } datas.Ave2 = datas.Ave*datas.Ave+datas.S*datas.S; value = datas.Ave2.toString(systems); } isnew = true; CounterMessage("Ave2"); } } //求数据和 //Sum=x1+x2+x3+...+xn function Sum() { if (data != undefined) { if (data.length == 0) { datas.Sum = 0; value = "0"; } else if (datas.Sum != undefined) { value = datas.Sum.toString(systems); } else { //计算Sum if (datas.Ave != undefined) { datas.Sum = datas.Ave*data.length; value = datas.Sum.toString(systems); } else { var num:Number = 0; for (var i in data) { num += data[i]; } datas.Sum = num; value = datas.Sum.toString(systems); } } isnew = true; CounterMessage("Sum"); } } //求数据平方和 //Sum2=x1*x1+x2*x2+x3*x3+...+xn*xn function Sum2() { if (data != undefined) { if (data.length == 0) { datas.Sum2 = 0; value = "0"; } else if (datas.Sum2 != undefined) { value = datas.Sum2.toString(systems); } else { //计算Sum2 var num:Number = 0; for (var i in data) { num += data[i]*data[i]; } datas.Sum2 = num; value = datas.Sum2.toString(systems); } isnew = true; CounterMessage("Sum2"); } } //求总体参数为n的标准差 //S=Math.sqrt((Sum2-n*Ave*Ave)/n) function S() { if (data != undefined) { if (data.length == 0) { datas.S = 0; value = "0"; } else if (datas.S != undefined) { value = datas.S.toString(systems); } else { if (datas.Ave == undefined) { //计算Ave if (datas.Sum != undefined) { var num:Number = datas.Sum; } else { var num:Number = 0; for (var i in data) { num += data[i]; } } datas.Ave = num/data.length; } //计算Sum2 if (datas.Sum2 == undefined) { var num2:Number = 0; for (var j in data) { num2 += data[j]*data[j]; } datas.Sum2 = num2; } //计算S datas.S = Math.sqrt((datas.Sum2-data.length*datas.Ave*datas.Ave)/data.length); value = datas.S.toString(systems); } isnew = true; CounterMessage("S"); } } //求总体参数为n-1的标准差 //S2=Math.sqrt((Sum2-(n-1)*Ave*Ave)/(n-1)) function S2() { if (data != undefined) { if (data.length == 0) { datas.S2 = 0; value = "0"; } else if (datas.S2 != undefined) { value = datas.S2.toString(systems); } else { if (datas.Ave == undefined) { //计算Ave if (datas.Sum != undefined) { var num:Number = datas.Sum; } else { var num:Number = 0; for (var i in data) { num += data[i]; } } datas.Ave = num/data.length; } //计算Sum2 if (datas.Sum2 == undefined) { var num2:Number = 0; for (var j in data) { num2 += data[j]*data[j]; } datas.Sum2 = num2; } //计算S datas.S2 = Math.sqrt((datas.Sum2-(data.length-1)*datas.Ave*datas.Ave)/(data.length-1)); value = datas.S2.toString(systems); } isnew = true; CounterMessage("S2"); } } //添加数据 function Data() { if (data != undefined) { if (systems == 10) { data.push(Number(value)); } else { data.push(parseInt(value, systems)); } datas = {Ave:undefined, Ave2:undefined, Sum:undefined, Sum2:undefined, S:undefined, S2:undefined}; isnew = true; CounterMessage("Data"); } } //将数据显示在显示框中 function load(n:Number) { if (data != undefined) { value = data[n].toString(systems); isnew = true; CounterMessage("load"); } } //清除数据 function clear(n:Number) { if (data != undefined) { data = data.slice(0, n).concat(data.slice(n+1)); isnew = true; CounterMessage("clear"); } } //清除全部数据 function clearAll() { if (data != undefined) { data = []; isnew = true; CounterMessage("clearAll"); } } // 显示Math.PI function PI() { if (systems == 10) { value = String(Math.PI); isnew = true; CounterMessage("PI"); } } //****************************************************************** //私有函数 //根据运算符号计算,与evals和evalPow构成了计算的核心 private function calculate():String { var c:Array = count; //trace(c) if (c.length == 1) { if (c[0].substr(-1, 1) == "^") { var st = Math.max(c[0].lastIndexOf("*"), c[0].lastIndexOf("/")); if (st != -1) { var n:Number = evals(c[0].slice(0, st)); c[0] = n.toString()+c[0].slice(st); return evals(c[0].slice(st+1, -1)).toString(systems); } else { var n:Number = evals(c[0].slice(0, -1)); c[0] = n.toString()+"^"; return n.toString(systems); } } else if (c[0].substr(-1, 1) == "*" || c[0].substr(-1, 1) == "/") { var n:Number = evals(c[0].slice(0, -1)); c[0] = n.toString()+c[0].substr(-1, 1); return n.toString(systems); } else { var n:Number = evals(c[0]); c[0] = n.toString(); return n.toString(systems); } } else if (c.length == 2) { var n:Number = evals(c[0]); c[0] = n.toString(); return n.toString(systems); } else if (c.length == 3) { if (c[2].substr(-1, 1) == "^") { var st = Math.max(c[2].lastIndexOf("*"), c[2].lastIndexOf("/")); if (st != -1) { var n:Number = evals(c[2].slice(0, st)); c[2] = n.toString()+c[2].slice(st); return evals(c[2].slice(st, -1)).toString(systems); } else { var n:Number = evals(c[2].slice(0, -1)); c[2] = n.toString()+"^"; return n.toString(systems); } } else if (c[2].substr(-1, 1,) == "*" || c[2].substr(-1, 1) == "/") { var n:Number = evals(c[2].slice(0, -1)); c[2] = n.toString()+c[2].substr(-1, 1); return n.toString(systems); } else { //trace(c[1]) if (c[1] == "+") { c[0] = (Number(c[0])+evals(c[2])).toString(); c[1] = c[3]; c.length = 1; return parseInt2(c[0], 10, systems); } else if (c[1] == "-") { c[0] = (Number(c[0])-evals(c[2])).toString(); c[1] = c[3]; c.length = 1; return parseInt2(c[0], 10, systems); } else if (c[1] == "%") { //trace(Number(c[0])%evals(c[2])) c[0] = (Number(c[0])%evals(c[2])).toString(); c[1] = c[3]; c.length = 1; return parseInt2(c[0], 10, systems); } } } else if (c.length == 4) { if (c[1] == "+") { c[0] = (Number(c[0])+evals(c[2])).toString(); c[1] = c[3]; c.length = 2; return parseInt2(c[0], 10, systems); } else if (c[1] == "-") { c[0] = (Number(c[0])-evals(c[2])).toString(); c[1] = c[3]; c.length = 2; return parseInt2(c[0], 10, systems); } else if (c[1] == "%") { c[0] = (Number(c[0])%evals(c[2])).toString(); c[1] = c[3]; c.length = 2; return parseInt2(c[0], 10, systems); } } } //根据运算符号运算 private function evals(n:String):Number { if (n.indexOf("^") == -1) { if (n.indexOf("*") == -1 && n.indexOf("/") == -1) { return Number(n); } else { var st:Number; var st2:String; var num:Number = Number(n.substr(0, (st=Math.min((n.indexOf("*") == -1) ? Infinity : n.indexOf("*"), (n.indexOf("/") == -1) ? Infinity : n.indexOf("/"))))); n = n.slice(st); while (n.length>0) { st2 = n.substr(0, 1); n = n.slice(1); var st = Math.min((n.indexOf("*") == -1) ? Infinity : n.indexOf("*"), (n.indexOf("/") == -1) ? Infinity : n.indexOf("/")); var mu = Number(n.substr(0, (st == Infinity) ? n.length : st)); if (st2 == "*") { num *= mu; n = n.slice((st == Infinity) ? 0 : st); } else if (st2 == "/") { num /= mu; n = n.slice((st == Infinity) ? 0 : st); } } return num; } } else { if (n.indexOf("*") == -1 && n.indexOf("/") == -1) { return evalPow(n); } else { var r = new Array(); var size = n.length; var c = 0; for (var i = 0; i<=size; ++i) { if (substring(n, i+1, 1) == "*" || substring(n, i+1, 1) == "/") { r.push(substring(n, c+1, i-c)); r.push(substring(n, i+1, 1)); c = i+1; } } if (c != i) { r.push(substring(n, c+1, i-c)); r.push(substring(n, i+1, 1)); } var num:Number = evalPow(r[0]); for (var j = 1; j<r.length-1; j += 2) { if (r[j] == "*") { num *= evalPow(r[j+1]); } else { num /= evalPow(r[j+1]); } } return num; } } } //计算x^y^z^... private function evalPow(n:String):Number { if (n.indexOf("^") == -1) { return Number(n); } else { var st:Number; var num:Number = Number(n.substr(0, (st=n.indexOf("^")))); n = n.slice(st+1); while (n.length>0) { var st = (n.indexOf("^") == -1) ? n.length : n.indexOf("^"); var mu = Number(n.substr(0, st)); n = n.slice(st+1); num = Math.pow(num, mu); } return num; } } //删除无用的符号 private function duseless() { if (value.substr(-1) == ".") { value = value.slice(0, -1); } } //改变数制 private function changeS(n:Number) { value = parseInt2(value, systems, n); systems = n; CounterMessage("SystemChange"); isnew = true; } //进制转化换 function parseInt2(s:String, from:Number, to:Number):String { if (from == 10) { return Number(s).toString(to).toUpperCase(); } else { return parseInt(s, from).toString(to).toUpperCase(); } } //角度转化为弧度 function dtr(angle:Number) { return angle*(Math.PI/180); } //弧度转化为角度 function rtd(angle:Number) { return angle*(180/Math.PI); } //数字分组 private function group() { output = value; if (grouping) { if (output.indexOf("e") == -1) { if (systems == 10) { var sign = ","; var n:Number = 3; } else { var sign = " "; var n:Number = 4; } if (output != "0") { if (output.indexOf(".") != -1) { var num = output.indexOf("."); } else { var num = output.length; } for (var i = num-n; i>0; i -= n) { if (output.slice(0, i) != "-") { output = output.slice(0, i).concat(sign, output.slice(i)); } } } } } } //化成科学记数法 function ChangetoE(n:Number) { if (n>=1) { if (String(n).length<16) { var nz = Math.floor(n); var nx = String(n).slice(String(nz).length+1); nx = Rtrim(nx, "0"); var ns = String(nz).split(""); var nsp = ns[0]+"."; for (var i = 1; i<ns.length; i++) { if (nx == 0) { if (ns[i] == 0) { var del = true; for (var j = i; j<ns.length; j++) { if (!ns[i] == 0) { del = false; break; } } if (del) { break; } } else { nsp += ns[i]; } } else { nsp += ns[i]; } } nsp = String(nsp); nsp = Rtrim(nsp, "0"); if (nx == "") { if (String(nsp).substr(-1, 1) == ".") { nsp = String(nsp).slice(0, -1); } } else { nx = String(nx); nsp += Rtrim(nx, "0"); } return String(nsp+"e+"+(ns.length-1)); } else { return n; } } else { if (n == 0) { return "0e+0"; } else if (n>0.00001) { var ns = String(n).split(""); var nt = 0; for (var i = 2; i<ns.length; i++) { if (Number(ns[i]) == 0) { nt++; } else { break; } } var nz = String(n).substr(nt+2, 1); var nx = String(n).substr(nt+3); if (nx != "") { return String(nz+"."+nx+"e-"+(nt+1)); } else { return String(nz+"e-"+(nt+1)); } } else { return n; } } } //化成普通数 function ChangetoF(n:Number) { var ns = String(n); if (ns.indexOf("e") == -1) { return n; } else { var nss = ns.split("e"); var nz = nss[0]; var nx = nss[1]; if (nz.indexOf(".") == -1) { for (var i = 0; i<Number(nx); i++) { nz += "0"; } } else { var nzs = nz.split("."); var nzz = nzs[0]; if (nzs[1].length<=Number(nx)) { for (var i = 0; i<(Number(nx)-Number(nzs[1])); i++) { nzz += "0"; } nz = nzz; } return String(nz); } } } //ChangetoF和ChangetoE函数支持,删除字符串右边的指定字符 function Rtrim(n:String, d:String) { if (d == undefined) { d = " "; } if (n.indexOf(d) != -1) { var ss = n.split(""); var ssl = ss.length; for (var i = ssl; i>=0; i--) { if (ss[i] == d) { if (i+1 == ss.length) { ss.pop(); } } } return ss.join(""); } else { return n; } } //*************************************************************************** //监听键盘用 function onKeyDown(Ob) { if ((Key.isDown(48) || Key.isDown(96)) && !Key.isDown(16)) { numbers(0); } if ((Key.isDown(49) || Key.isDown(97)) && !Key.isDown(16)) { numbers(1); } if ((Key.isDown(50) || Key.isDown(98)) && !Key.isDown(16)) { numbers(2); } if ((Key.isDown(51) || Key.isDown(99)) && !Key.isDown(16)) { numbers(3); } if ((Key.isDown(52) || Key.isDown(100)) && !Key.isDown(16)) { numbers(4); } if ((Key.isDown(53) || Key.isDown(101)) && !Key.isDown(16)) { numbers(5); } if ((Key.isDown(54) || Key.isDown(102)) && !Key.isDown(16)) { numbers(6); } if ((Key.isDown(55) || Key.isDown(103)) && !Key.isDown(16)) { numbers(7); } if ((Key.isDown(56) || Key.isDown(104)) && !Key.isDown(16)) { numbers(8); } if ((Key.isDown(57) || Key.isDown(105)) && !Key.isDown(16)) { numbers(9); } // A键 if (Key.isDown(65)) { numbers("A"); } // B键 if (Key.isDown(66)) { numbers("B"); } // C键 if (Key.isDown(67)) { numbers("C"); } // D键 if (Key.isDown(68)) { numbers("D"); } // E键 if (Key.isDown(69)) { numbers("E"); } // F键 if (Key.isDown(70)) { numbers("F"); } // F9 键 if (Key.isDown(120)) { minuss(); } //.键 if (Key.isDown(110)) { dot(); } //BackSpace键 if (Key.isDown(8)) { BackSpace(); } //ESC 键 if (Key.isDown(27)) { C(); } // delete 键 if (Key.isDown(46)) { CE(); } //+键 if (Key.isDown(107)) { plus(); } //-键 if (Key.isDown(109)) { minus(); } //*键或shift+8 if (Key.isDown(106) || (Key.isDown(56) && Key.isDown(16))) { multiply(); } // /键 if (Key.isDown(111) || Key.isDown(191)) { except(); } //shift+2 if (Key.isDown(50) && Key.isDown(16)) { sqrt(); } //Enter if (Key.isDown(13)) { equal(); } //shift+5 if (Key.isDown(53) && Key.isDown(16)) { percent(); } // R键 if (Key.isDown(82)) { reciprocal(); } //ctrl+L if (Key.isDown(76) && Key.isDown(17)) { MC(); } //ctrl+R if (Key.isDown(82) && Key.isDown(17)) { MR(); } //ctrl+M if (Key.isDown(77) && Key.isDown(17)) { MS(); } //ctrl+P if (Key.isDown(80) && Key.isDown(17)) { MP(); } //P键 if (Key.isDown(80)) { PI(); } //T键 if (Key.isDown(84)) { tan(); } //ctrl+T if (Key.isDown(84) && Key.isDown(17)) { atan(); } //S键 if (Key.isDown(83)) { sin(); } //ctrl+S if (Key.isDown(83) && Key.isDown(17)) { asin(); } //O键 if (Key.isDown(79)) { cos(); } //ctrl+O if (Key.isDown(79) && Key.isDown(17)) { acos(); } //ctrl+2 if (Key.isDown(50) && Key.isDown(17)) { pow2(); } //;键 if (Key.isDown(186)) { this.int(); } //ctrl+; if (Key.isDown(186) && Key.isDown(17)) { aint(); } //V键 if (Key.isDown(86)) { FtoE(); } //shift+9 if (Key.isDown(57) && Key.isDown(16)) { leftBracket(); } //shift+0 if (Key.isDown(48) && Key.isDown(16)) { rightBracket(); } //shift+3 if (Key.isDown(51) && Key.isDown(16)) { pow3(); } //Y键 if (Key.isDown(89)) { pow(); } //N键 if (Key.isDown(78)) { log(); } //shift+N if (Key.isDown(78) && Key.isDown(16)) { exp(); } //L键 if (Key.isDown(76)) { Exp(); } //shift+! if (Key.isDown(49) && Key.isDown(16)) { factorial(); } //M键 if (Key.isDown(77)) { dms(); } //shift+M if (Key.isDown(77) && Key.isDown(16)) { adms(); } //ctrl+5 if (Key.isDown(53) && Key.isDown(17)) { Mod(); } //ctrl+S if (Key.isDown(83) && Key.isDown(17)) { Sta(); } //shift+A if (Key.isDown(65) && Key.isDown(16)) { Ave(); } //ctrl+A if (Key.isDown(65) && Key.isDown(17)) { Ave2(); } //shift+T if (Key.isDown(84) && Key.isDown(16)) { Sum(); } //ctrl+T if (Key.isDown(84) && Key.isDown(17)) { Sum2(); } //shift+D if (Key.isDown(68) && Key.isDown(16)) { S(); } //ctrl+D if (Key.isDown(68) && Key.isDown(17)) { S2(); } //Insert键 if (Key.isDown(45) && Key.isDown(17)) { Data(); } //ctrl+shift+L if (Key.isDown(76) && Key.isDown(17) && Key.isDown(16)) { load(); } //ctrl+shift+C if (Key.isDown(67) && Key.isDown(17) && Key.isDown(16)) { clear(); } //ctrl+shift+A if (Key.isDown(65) && Key.isDown(17) && Key.isDown(16)) { clearAll(); } } //监听器用 function addListener(Ob:Object) { _listeners.push(Ob); } function removeListener(Ob:Object) { for (var i = 0; i<_listeners.length; i++) { if (_listeners[i] == Ob) { _listeners.splice(i, 1); } } } function broadcastMessage() { for (var i = 0; i<_listeners.length; i++) { _listeners[i][arguments[0]](arguments[1], arguments[2], arguments[3]); } } function CounterMessage(n:String) { group(); broadcastMessage("onKeyDown", n, output, value); } //Getter And Setter function get memory():Number { return getMemory(); } function getMemory():Number { return remember; } function get hasMemory():Boolean { return gethasMemory(); } function gethasMemory():Boolean { return (remember != undefined); } function set system(n:Number) { setSystem(n); } function get system():Number { return getSystem(); } function setSystem(n:Number) { if (n>=2 && n<=36) { changeS(n); } } function getSystem():Number { return systems; } function set unit(n:String) { setUnit(n); } function get unit():String { return getUnit(); } function setUnit(n:String) { if (n == "radian") { units = 1; } else if (n == "degree") { units = 0; } } function getUnit():String { var n:String = ""; if (units=1) { n == "radian"; } else if (units=0) { n == "degree"; } return n; } function get hasBracket():Boolean { return gethasBracket(); } function gethasBracket():Boolean { return (inbracket.length != 0); } function get bracketNum():Number { return getBracketNum(); } function getBracketNum():Number { return inbracket.length; } function get hasData():Boolean { return gethasData(); } function gethasData():Boolean { return (data != undefined); } function get n():Number { return getN(); } function getN():Number { return data.length; } } //End
运算的关键是calculate()和evals()。前者是把算式合理拆分,后者负责计算只包含乘,除和幂的字符串。然后在由calculate()计算加,减,取模,这就实现了按运算法则运算。希望能帮忙再改进一下。
还有,里面的阶乘(factorial()函数)希望会的同志改一下,现在只能算整数,最好整数,小数通吃。顺便问一下,梯度是什么?怎么换算?我希望能做出比Windows自带的计算器更好的计算器,至少功能要同样丰富。
as文件:
点击浏览该文件
|