Calculator
/
calculator.cpp
108 строк · 3.1 Кб
1#include "calculator.h"2
3
4QString Calculator::calcAll(QString all){5all = deleteUnnecessary(all);6all = seekDevideMulti(all);7all = seekMinusPlus(all);8all = rounding(all);9return all;10}
11
12QString Calculator::deleteUnnecessary(QString all){13if(all == "-") return "0";14while(!isdigit(QString(all).toStdString()[all.size()-1])){15all.remove(all.size()-1,1);16}17return all;18}
19
20QString Calculator::plus(QString firstNum, QString secondNum){21double res = firstNum.toDouble() + secondNum.toDouble();22
23return QString::number(res, 'g', 31);24}
25
26QString Calculator::minus(QString firstNum, QString secondNum){27double res = firstNum.toDouble() - secondNum.toDouble();28
29return QString::number(res, 'g', 31);30}
31
32QString Calculator::multi(QString firstNum, QString secondNum){33double res = firstNum.toDouble() * secondNum.toDouble();34
35return QString::number(res, 'g', 31);36}
37
38QString Calculator::devide(QString firstNum, QString secondNum){39double res = firstNum.toDouble() / secondNum.toDouble();40if(secondNum.toDouble() == 0)41res = 0;42
43return QString::number(res, 'g', 31);44}
45
46QString Calculator::doOperation(QString firstNum,QString op, QString secondNum){47
48if(op == "+") return plus(firstNum, secondNum);49else if(op == "-") return minus(firstNum, secondNum);50else if(op == "/") return devide(firstNum, secondNum);51else if(op == "x") return multi(firstNum, secondNum);52return 0;53}
54
55QString Calculator::seekDevideMulti(QString all){56QRegExp rx_d("([\\-]?\\d+\\.?\\d*)[\\/]([\\-]?\\d+\\.?\\d*)");57QRegExp rx_multi("([\\-]?\\d+\\.?\\d*)[x]([\\-]?\\d+\\.?\\d*)");58return countPath(all ,rx_multi, rx_d, "x", "/");59
60}
61
62QString Calculator::seekMinusPlus(QString all){63QRegExp rx_m("([\\-]?\\d+\\.?\\d*)[\\-]([\\-]?\\d+\\.?\\d*)");64QRegExp rx_p("([\\-]?\\d+\\.?\\d*)[\\+]([\\-]?\\d+\\.?\\d*)");65return countPath(all ,rx_m, rx_p, "-", "+");66
67}
68
69QString Calculator::countPath(QString all, QRegExp rxOne, QRegExp rxTwo, QString opOne, QString opTwo){70int id;71QString res;72QString firstNum,secondNum;73
74while(rxOne.indexIn(all) != -1 || rxTwo.indexIn(all) != -1){75if(rxTwo.indexIn(all) == -1 || (rxOne.indexIn(all)<rxTwo.indexIn(all) && rxOne.indexIn(all) != -1)){76firstNum = rxOne.cap(1);77secondNum = rxOne.cap(2);78id = rxOne.indexIn(all);79res = doOperation(firstNum, opOne, secondNum);80}81else{82firstNum = rxTwo.cap(1);83secondNum = rxTwo.cap(2);84id = rxTwo.indexIn(all);85res = doOperation(firstNum, opTwo, secondNum);86}87
88all.replace(id, firstNum.size() + secondNum.size()+1, res);89}90
91return all;92}
93
94QString Calculator::rounding(QString all){95QRegExp rx_point("([\\-]?\\d+\\.\\d)(\\d)(\\d)");96if(rx_point.indexIn(all) >= 0){97QString delta;98
99if(rx_point.cap(3).toDouble() >= 5){100delta = "1";101}102else {delta = "0";}103
104all = rx_point.cap(1) + plus(rx_point.cap(2), delta);105}106if (all.toDouble() == 0) return "0";107return all;108}
109