最近学习的时候自己写了两个函数,可以将字符串类型的算式算出来,记录一下。支持四则运算和小括号。
开发环境是微信开发者工具,亲测可用,有需要的可以自取,需要优化的地方可以自便。
第一个函数stringToNum()接收一个字符串形式的算式,但不支持小括号,返回值类型number。
第二个函数strToNumWithBrk()也接收一个字符串形式的算式,支持小括号,返回值类型number,这个函数需要调用第一个函数。
function stringToNum(str){
var par = [
{num:0, left:'', right:''}, {num:0, left:'', right:''},
{num:0, left:'', right:''}, {num:0, left:'', right:''},
{num:0, left:'', right:''}, {num:0, left:'', right:''},
{num:0, left:'', right:''}, {num:0, left:'', right:''},
{num:0, left:'', right:''}, {num:0, left:'', right:''},
{num:0, left:'', right:''}, {num:0, left:'', right:''},
];//储存所有数字及运算符
var start = 0;
var index = 0;
var calin = str.replace(/\s*/g,""); //删除所有空白符
//console.log(str);
for(let i=0; i<calin.length+1; i++)//此循环取出所有运算符和数字
{
let temp = calin.charAt(i);
if( temp == '+' || temp == '-' || temp == '*' ||
temp == '/' || temp == '×' || temp == '÷' || temp == ''){
par[index].num = Number(calin.slice(start,i));
par[index].left = calin.charAt(start-1);
par[index].right = calin.charAt(i);
index++;
start = ++i;
if(temp == ''){//删除par中剩余未使用的对象
par.splice(index);
}
}
}
//console.log(par);
for(let j=0; j<par.length; )//此循环做乘除法
{
let temp = par[j].right
if(temp == '×' || temp == '÷' || temp == '*'|| temp == '/'){
if(temp == '×' || temp == '*'){
par[j+1].num = par[j].num * par[j+1].num;
par[j+1].left = par[j].left;
par.splice(j,1);
j = 0;
}
else{
par[j+1].num = par[j].num / par[j+1].num;
par[j+1].left = par[j].left;
par.splice(j,1);
j = 0;
}
}
else{
j++;
}
}//console.log(par)
for(let j=0; par[j].right != '';)//做加减法
{
if(par[j].right == '+'){
par[j+1].num = par[j].num + par[j+1].num;
par.splice(j,1);
j = 0;
}
else if(par[j].right == '-'){
par[j+1].num = par[j].num - par[j+1].num;
par.splice(j,1);
j = 0;
}
}//console.log(par[0]);
return par[0].num;
}
function strToNumWithBrk(str){
var calin = str.replace(/\s*/g,""); //删除所有空白符
var withBrackets = ''; //储存只有一对括号的字符串
var withoutBrackets = ''; //去除括号,只保留算式
var result = ''; //储存运算结果
while(calin.match(/[\(][^()]+[\)]/))//循环直到去除所有括号
{
withBrackets = calin.match(/[\(][^()]+[\)]/);//匹配字符串中只有一对括号的算式
//console.log(withBrackets);
withoutBrackets = withBrackets.join().replace(/\(|\)/g,"");//将匹配结果的括号去除
//console.log(withoutBrackets);
result = stringToNum(withoutBrackets);//将去除括号的算式算出一个值
//console.log(result);
calin = calin.replace(withBrackets,result);//用算出的值替换包含一对括号的算式
//console.log(calin);
}
result = stringToNum(calin);//返回最终结果
//console.log(result);
return result;
}