#include "Formula.h"
Formula::Formula(QObject *parent) : QObject(parent)
{
}
//执行公式
QString Formula::executeFormula(QString Formula,QMap<QString,double> StrAndNum){
//QString aa="(好*1+一般*0.8+较好*0.6+差*0.4)*100/(好+一般+较好+差)";
Formula= filter(Formula,StrAndNum);
return explain(Formula);
}
//过滤
QString Formula::filter(QString Formula,QMap<QString,double> StrAndNum){
Formula= Formula.replace("(","(").replace(")",")");
QRegExp NotInExp("[^0-9^.^(^)^+^\\-^*^/]+");
int index=-1;
int offset=0;
//QString str="";
do {
index= NotInExp.indexIn(Formula,offset);
QString tempstr=NotInExp.cap(0);
QString valueStr=QString::number(StrAndNum.find(tempstr).value());
int length=NotInExp.matchedLength();
Formula.remove(index,length);
Formula.insert(index,valueStr);
//str+=tempstr+" ";
offset=index+valueStr.length();
} while (index!=-1);
//qDebug(str.toStdString().c_str());
return Formula;
}
//解释
QString Formula::explain(QString Formula){
int startIndex=0;
int endIndex=0;
int index=0;
do {
if(Formula.at(index)=='('){
startIndex=index;
endIndex=index;
}
else if(Formula.at(index)==')'){
endIndex=index;
}
if(startIndex<endIndex){
if(Formula.at(startIndex)=='('&&Formula.at(endIndex)==')'){
int length=(endIndex-startIndex)+1;
QString s=Formula.mid(startIndex,length);
double num=calculate(s);
Formula.remove(startIndex,length);
QString NumStr=QString::number(num,'f',3);
Formula.insert(startIndex,NumStr);
index=startIndex=endIndex=startIndex+NumStr.length();
}
}
index+=1;
} while (index<Formula.length());
//qDebug(Formula.toStdString().c_str());
if(Formula.contains("(")||Formula.contains(")"))
Formula=explain(Formula);
//返回保留两位小数
return QString::number(calculate(Formula),'f',2);
}
//进行没有括号的加减乘除运算
double Formula::calculate(QString MiniFormula){
try
{
QString mini= MiniFormula.replace("(","").replace(")","");
//qDebug(mini.toStdString().c_str());
if(mini.contains("+")){
QStringList arr= mini.split("+",Qt::SplitBehavior::enum_type::SkipEmptyParts);
double temp=calculate(arr[0]);
for (int i = 1; i < arr.count(); ++i)
temp+=calculate(arr[i]);
return temp;
}
else if(mini.contains("-")&&mini.at(0)!="-"){
QStringList arr= mini.split("-",Qt::SplitBehavior::enum_type::SkipEmptyParts);
double temp=calculate(arr[0]);
for (int i = 1; i < arr.count(); ++i)
temp-=calculate(arr[i]);
return temp;
}
else if(mini.contains("*")){
QStringList arr= mini.split("*",Qt::SplitBehavior::enum_type::SkipEmptyParts);
double temp=calculate(arr[0]);
for (int i = 1; i < arr.count(); ++i)
temp*=calculate(arr[i]);
return temp;
}
else if(mini.contains("/")){
QStringList arr= mini.split("/",Qt::SplitBehavior::enum_type::SkipEmptyParts);
double temp=calculate(arr[0]);
for (int i = 1; i < arr.count(); ++i)
temp/=calculate(arr[i]);
return temp;
}
else{
bool ok;
double num=mini.toDouble(&ok);
if(!ok){throw QString("数字转换错误");}
return num;
}
} catch (QString msg) {throw msg;}
}