JavaScript实现计算复杂计算公式(支持括号)

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 16:05   1439   0
//计算器

var CalcEval = function() {};

//复杂的计算方法(包含括号)
CalcEval.prototype.complexEval = function(str) {
if (str == null) {
return "";
}
if (typeof str != "string") {//转化成字符串
str = str + ""
}
var multObj = str.match(/\(([^\(\\)]*?)\)/g);//匹配括号
//不断计算最底层括号的数据
while (null != multObj)
{
var content = multObj[0] +"";

var result = this.simpleEval(content.substr(1,content.length-2));
str = str.replace(multObj[0],result);
multObj = str.match(/\(([^\(\\)]*?)\)/g);
}

return this.simpleEval(str);
};
//简单的计算方法,只有加减乘除
CalcEval.prototype.simpleEval = function(str) {
if (str == null) {
return "";
}
if (typeof str != "string") {//转化成字符串
str = str + ""
}

var valueArray = new Array();//值的数组
var markArray = new Array();//符号的数组
var tempValue = "";
var ch = str.split("");
var isOper = false;
for(var i=0; i< ch.length; i++){
if( ch[i] == "+" || ch[i] == "-" || ch[i] == "*" || ch[i] == "/") {//符号
var dv = tempValue*1;
if(isOper){
var value = valueArray.pop();
var mark = markArray.pop();
dv = this.simpleTwoEval(mark, value, dv);
}
valueArray.push(dv);
markArray.push(ch[i]);
tempValue = "";
isOper = false;
if( ch[i] == "*" || ch[i] == "/" )
isOper = true;
}else{
tempValue += ch[i] + "";
if(i == ch.length -1){//最后一位
var dv = tempValue*1;
if(isOper){
var dv1 = valueArray.pop();
var mark = markArray.pop();
var result = this.simpleTwoEval(mark, dv1, tempValue);
dv = result;
}
valueArray.push(dv);
}
}
}

valueArray = this.reverseArray(valueArray);
markArray = this.reverseArray(markArray);
while(valueArray.length > 1){
var v1 = valueArray.pop();
var v2 = valueArray.pop();
var mark = markArray.pop();
valueArray.push(this.simpleTwoEval(mark, v1, v2));
}
return valueArray[0];

};

//两个数的加减乘除
CalcEval.prototype.simpleTwoEval = function(mark,value1,value2){
if(mark == "+"){
return value1 + value2;
}else if(mark == "-"){
return value1 - value2;
}else if(mark == "*"){
return value1 * value2;
}else if(mark == "/"){
return value1 / value2;
}
return 0;
};

//反转数组
CalcEval.prototype.reverseArray = function(oldArray){
var newArray = new Array();
var size = oldArray.length;
for(var i=0; i< size; i++){
newArray.push(oldArray.pop());
}
return newArray;

};


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP