QT 四则运算

1 篇文章 0 订阅
1 篇文章 0 订阅
#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;}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值