计算器

一、封装类

public static void main(String[] args) throws Exception {
ScriptEngine js = new ScriptEngineManager().getEngineByName("JavaScript");
System.out.println(js.eval("(-2+3*5) + 30*10%".replaceAll("%","/100")));
}

二、原创计算器工具类

package com;import java.math.BigDecimal;
import java.util.LinkedList;
import java.util.List;public class Calculate {public static void main(String[] args) throws Exception{System.out.println(getResult("-2+3*5"));}private static String getResult(String formula) throws Exception{formula = formula.replace("(","(");formula = formula.replace(")",")");String reg = "[0-9\\\\.*%+()/-]*";if(!formula.matches(reg)){return "";}int leftCount = 0;int rightCount = 0;for(int i=0;i<formula.length();i++){int left = formula.indexOf("(",i);if(left!=-1){leftCount++;i = left;}else{break;}}for(int i=0;i<formula.length();i++){int right = formula.indexOf(")",i);if(right!=-1){rightCount++;i = right;}else{break;}}if(leftCount!=rightCount){return "";}String formulaResult = formula;formulaResult = getBrackets(formulaResult);formulaResult = formulaResult.replace(formulaResult, getResultDetail(formulaResult));return new BigDecimal(formulaResult).setScale(2,BigDecimal.ROUND_HALF_UP).toString();}//处理表达式小括号public static String getBrackets(String formula) throws Exception{if(formula.contains("(")){int left = formula.lastIndexOf("(");int right = formula.indexOf(")",left);String formulaTemp = formula.substring(left,right+1);String result = getResultDetail(formulaTemp);formula = formula.replace(formulaTemp,result);formula = getBrackets(formula);}return formula;}//计算表达式public static String getResultDetail(String formula) throws Exception{formula = formula.replace("(","");formula = formula.replace(")","");//处理百分号List<Integer> percentList = new LinkedList<Integer>();for(int i=0;i<formula.length();i++){int percent = formula.indexOf("%",i);if(percent!=-1){percentList.add(percent);i=percent;}else{break;}}String formulaTemp = formula;for(int i=0;i<percentList.size();i++){String percentNum = formula.substring(0,percentList.get(i));int sub = percentNum.lastIndexOf("-");int add = percentNum.lastIndexOf("+");int mul = percentNum.lastIndexOf("*");int div = percentNum.lastIndexOf("/");int num = Integer.max(Integer.max(Integer.max(sub,add),mul),div);String numStr = formula.substring(num+1,percentList.get(i));formulaTemp = formulaTemp.replace(numStr+"%",new BigDecimal(numStr).multiply(new BigDecimal("0.01")).setScale(4,BigDecimal.ROUND_HALF_UP).toString());}formula = formulaTemp;String formulaResult = formula;formulaResult = calculateFirst(formulaResult);formulaResult = calculateSecond(formulaResult);return formulaResult;}//计算表达式所有乘除public static String calculateFirst(String formula) throws Exception{if(hasFirst(formula)){formula = getFirst(formula);formula = calculateFirst(formula);}return formula;}//计算表达式所有加减public static String calculateSecond(String formula) throws Exception{if(hasSecond(formula)){formula = getSecond(formula);formula = calculateSecond(formula);}return formula;}//判断表达式是否有乘除public static boolean hasFirst(String formula) throws Exception{int mul = formula.indexOf("*");int div = formula.indexOf("/");int max = Integer.max(mul,div);boolean flag = false;if(max != -1){flag = true;}return flag;}//判断表达式是否有加减public static boolean hasSecond(String formula) throws Exception{int sub = formula.indexOf("-")==0?formula.indexOf("-",1):formula.indexOf("-");int add = formula.indexOf("+");int max = Integer.max(sub,add);boolean flag = false;if(max != -1){flag = true;}return flag;}//算表达式乘除,返回之后的表达式public static String getFirst(String formula) throws Exception{int mul = formula.indexOf("*");int div = formula.indexOf("/");int min = Integer.min(mul,div);min = min==-1?Integer.max(mul,div):min;String formulaResult = formula;List<String > list = getFormula(formula,min);BigDecimal result = bigDecimalCal(new BigDecimal(list.get(1)),new BigDecimal(list.get(2)),list.get(0).charAt(0));formulaResult = formulaResult.replace(list.get(1) + list.get(0) + list.get(2), result.toString());return formulaResult;}//算表达式加减,返回之后的表达式public static String getSecond(String formula) throws Exception{int sub = formula.indexOf("-")==0?formula.indexOf("-",1):formula.indexOf("-");int add = formula.indexOf("+");int min = Integer.min(sub,add);min = min==-1?Integer.max(sub,add):min;String formulaResult = formula;List<String > list = getFormula(formula,min);BigDecimal result = bigDecimalCal(new BigDecimal(list.get(1)),new BigDecimal(list.get(2)),list.get(0).charAt(0));formulaResult = formulaResult.replace(list.get(1) + list.get(0) + list.get(2), result.toString());return formulaResult;}//找出两个参数及运算符public static List<String> getFormula(String formula, int n) throws Exception{List<String> list = new LinkedList<String>();list.add(formula.charAt(n) + "");String leftStr = formula.substring(0,n);String rightStr = formula.substring(n+1);int leftSub = leftStr.lastIndexOf("-");int leftAdd = leftStr.lastIndexOf("+");int leftMul = leftStr.lastIndexOf("*");int leftDiv = leftStr.lastIndexOf("/");int leftNum = Integer.max(Integer.max(Integer.max(leftSub,leftAdd),leftMul),leftDiv);list.add(formula.substring(leftNum==0?leftNum:leftNum+1,n));int rightSub = rightStr.lastIndexOf("-")==0?rightStr.indexOf("-",1):rightStr.indexOf("-");int rightAdd = rightStr.lastIndexOf("+");int rightMul = rightStr.lastIndexOf("*");int rightDiv = rightStr.lastIndexOf("/");int rightNum = -1;List<Integer> rightList = new LinkedList<Integer>();if(rightSub!=-1){rightList.add(rightSub);}if(rightAdd!=-1){rightList.add(rightAdd);}if(rightMul!=-1){rightList.add(rightMul);}if(rightDiv!=-1){rightList.add(rightDiv);}for(int i=0;i<rightList.size();i++){if(rightNum == -1){rightNum = rightList.get(i);}else if(rightList.get(i)<rightNum){rightNum = rightList.get(i);}}list.add(formula.substring(n+1,rightNum == -1?formula.length():n+1+rightNum));return list;}//计算制定两个参数及运算符public static BigDecimal bigDecimalCal(BigDecimal a1, BigDecimal a2, char operator) throws Exception{switch (operator){case '+':return a1.add(a2);case '-':return a1.subtract(a2);case '*':return a1.multiply(a2);case '/':return a1.divide(a2,20,BigDecimal.ROUND_HALF_UP);default:break;}throw new Exception("illegal operator!");}}

计算(输入计算式得出结果)相关推荐

  1. 计算机一级表格加减乘除公式,excel怎样在一个表格内输入计算式,另一个表格内显示结果?【excel怎么做表格】...

    excel表格如何用公式计算加减乘除混合运算? excel表格如何用公式计算乘除运算: 直接在FX里面输入=C8*F8 G8.要先算加号,输入=C5*(F8 G8)可以了. 如何用Excel电子表格进 ...

  2. excel函数公式html文档,Excel中把计算式转换为运算结果的方法 EXCEL中计算出的公式如何转换成纯文本内容?...

    如何在EXCEL中将计算公式直接变结果如我在A1输入计算式:(1+2*3+4/5-6)*1.2+(1+5) 如何在B1得出该计算式的选中B1然后按快捷键ctrl+F3,进入名称管理器,新建,输入任意名 ...

  3. 给定一个字符串计算式,计算结果

    面试的一个题,当时只说了算法思路和大概实现步骤,现在我把完整的做出来,嗯嗯嗯,不晓得我这样算不算复杂,欢迎大家来建议,一起讨论讨论 给定一个计算式(包含加减乘除四则运算)字符串,计算结果 算法思想: ...

  4. excel字符串和单元格拼接_Excel单元格内计算式及字符串拼接实现

    基本语法 &:逻辑并,用以拼接字符串 =:计算式求结果 " ":其内部放入要显示的字符串 实现计算的方法 案例模拟: 1.定义名称 在Excel的菜单栏,插入->名称 ...

  5. j2ee:servlet练习鲜花项目(购物车、分页、ajax、iframe弹出层、jquery、json(计算小计、总计)、map集合高级遍历、图片上传)...

    第一:概念 购物车全过程的理解:  1.新建一个购物车类,这样,这个类里面就可以封装商品对象和商品数量了.  2.每种商品都是一个购物车  3.把所有的购物车放在一起,也就是放在一个map集合中,这样 ...

  6. 猜猜在用计算机计算一道除法算式时,沪教版三年级下学期《第4单元+计算器》2019年单元测试卷与答案...

    沪教版三年级下学期<第4单元 计算器>2019年单元测试卷 一.选择题(共8小题) 1.计算器上的清除键是( ) A.M+ B.= C.CE D.﹣ 2.在计算器上用来清除的键是( ) A ...

  7. python计算输入的两个数字,try...except...判断是否输入的是数字,如果是则相加

    python计算输入的两个数字,try-except-判断是否输入的是数字,如果是则相加,如果不输入q或者n,则循环一直下去: print("Enter 'q' to quit\n" ...

  8. python输入数字翻译成星期几-Python练习笔记——计算输入日期为改年的第几天、星期几...

    # 输入年月日,如:1995年12月10日,计算是该年的第几天? # 同时计算出当天是星期几? print("请依据提示依次输入您想查询的年 月 日") # 第一段代码块(年月日输 ...

  9. iOS计算输入字符数

    2019独角兽企业重金招聘Python工程师标准>>> iOS计算输入字符数 本文展示在iOS下,如何正确的计算输入的字符个数. 常见编码 汉字.中文符号 UTF-8编码下,一个汉字 ...

最新文章

  1. hibernate关联关系(一对多)
  2. 测试HAPROXY的文件分流办法
  3. linux用于查看文件内容 tail、cat、more、less、head 、sed 命令
  4. oracle和mysql通用建表语句_mysql建表语句到oracle怎么写?
  5. python京东商品_Python爬取京东的商品分类与链接
  6. 数据科学 IPython 笔记本 8.13 自定义刻度
  7. flex布局最后一行左对齐的处理
  8. 拿空间换时间的字典-Python基础前传(9)
  9. HFT-CNN:层级多标签分类,让你的模型多学习几次
  10. 华为路由与交换 eSight基本概述学习笔记
  11. python字符转换unicode编码_Python字符编码转换Unicode和str
  12. POJ 2387 Dijkstra
  13. 多个桌面Deskspace如何使用
  14. python跳出双循环break图例
  15. 华为鸿蒙系统的手机爆光图片,华为P50曝光,隐形镜头+麒麟9000E+鸿蒙系统,欣喜油然而生...
  16. numpy 数组扩充维度
  17. LeetCode 883. 三维形体投影面积(数学)
  18. 归一法的计算方法讲解_数学归一法是什么能举个具体例子吗
  19. 项羽败给刘邦的一个很大原因就是项…
  20. 巧破网页禁用鼠标右键

热门文章

  1. C - Super Mario(分块+二分)
  2. AGV调度:路径规划
  3. ARM平台处理器简介-ARMv7
  4. synaptics触摸板新驱动强势更新[附下载]!
  5. 机器学习讲堂 ACF 聚合通道检测
  6. 微信输入就死机问题处理
  7. 相关分析怎么进行?有哪些条件?
  8. 大数据风控项目实战 Drools规则引擎
  9. 基于STC15系列单片机课程中讲到的汇编指令(一)
  10. ToolsOh第6批收录