package y2019.m08.d24;import java.awt.*;
import java.awt.event.*;
import java.math.BigDecimal;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** 简单的计算器* * @author luther* @日期 2019.8.25* @version 1.0* * 有待优化的地方 BUG:* 1,Button增加回退按键监听* 2,增加括号运算(),指数运算* 3,界面优化* 4,末尾去0和小数点* 5,文本框全选输入时 覆盖* 6,增加回退,清空,括号等Button按键* 7,* */
public class MyCalc {public static void main(String[] args) {new MyCalc().init();}/*多次需要使用的正则表达式,运算符,减号需要转义,否则表示范围了,如[a-z];运算数,包含整数或小数*/private static final String OPERS = "[\\+\\-\\*/]";private static final String NUMBER = "((\\d+\\.\\d*)|\\d+)";//定义是否刚刚进行过计算,用于下一次输入前清空文本框private boolean isDoCalc = false;//按键4*4按钮文本private static final String[] BUTTS = {"7", "8", "9", "+", "4", "5", "6", "-", "1", "2", "3", "*", "0", ".", "=", "/"};//按键4*4按钮private Button[] bs = new Button[BUTTS.length];//主窗口,使用默认的5方向管理器private Frame f = new Frame("计算器");//输入框private TextField tf = new TextField(30);//4*4按键区private Panel p = new Panel(new GridLayout(4, 4));/*** 初始化入口*/public void init() {//输入框背景色,银色tf.setBackground(new Color(0xE6E8FA));//输入框注册按键监听器,实现1,ESC退出程序,//2,计算后,清空文本区;3,Enter回车键进行计算tf.addKeyListener(new KeyAdapter() {public void keyPressed(KeyEvent e) {if(e.getKeyCode() == KeyEvent.VK_ESCAPE) {System.exit(0);}else if(isDoCalc) {tf.setText("");isDoCalc = false;}else if(e.getKeyCode() == KeyEvent.VK_ENTER){doCalc();}}});//4*4按钮Button监听器ActionListener bListener = new ActionListener() {public void actionPerformed(ActionEvent e) {if(e.getActionCommand().equals("=")) {doCalc();}else{String cmd = e.getActionCommand();tf.setText(isDoCalc ? (isDoCalc = false) ? "" : cmd : tf.getText() + cmd);}}};//4*4按键监听器KeyAdapter bkListener = new KeyAdapter() {public void keyPressed(KeyEvent e) {String code = KeyEvent.getKeyText(e.getKeyCode());if(code.equals("Enter")) {doCalc();}else if(code.startsWith("NumPad") || code.matches("\\d")) {code = code.substring(code.length() - 1);tf.setText(isDoCalc ? (isDoCalc = false) ? "" : code : tf.getText() + code);}else{//System.out.println(code);}}};//初始化按键,注册监听器ActionListener和KeyListener,并组合成4*4按键区for(int i = 0; i < BUTTS.length; i++) {bs[i] = new Button(BUTTS[i]);bs[i].addActionListener(bListener);bs[i].addKeyListener(bkListener);p.add(bs[i]);}//Frame注册WindowListener监听器,实现关闭按钮f.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {Runtime.getRuntime().exit(0);}});//Frame组合,初始化f.add(tf, BorderLayout.NORTH);f.add(p);f.setLocation(800, 300);f.pack();f.setVisible(true);}/*** 获取计算表达式,显示计算结果*/private void doCalc() {tf.setText(recCalc(tf.getText()));}/*** 递归计算recursive algorithm* @param repre 需要计算的字符串* @return 计算的结果*/private String recCalc(String exp) {//去掉末尾的小数点和0//表达式校验1,无法计算的表达式,2只有一个数的表达式,3只需一次计算的表达式,4多次运算if(!exp.matches("^" + NUMBER + "(" + OPERS + NUMBER + ")*$")) {isDoCalc = true;return "无法计算";}else if(exp.matches(NUMBER)) {return exp;}else if(exp.matches("^" + NUMBER + OPERS + NUMBER + "$")) {return simpleCalc(exp);}else {//两个字符串:子计算结果和新表达式,进入该分支必定是包含2个运算符及以上String subResult = "";String result = exp;//获取子表达式,先获取乘除表达式Matcher m = Pattern.compile(NUMBER + "(\\*|/)" + NUMBER).matcher(exp);if (m.find()) {subResult = m.group();}else {m = Pattern.compile(NUMBER + OPERS + NUMBER).matcher(exp);m.find();subResult = m.group();}//替换子表达式转换成正则表达式即子字符串的+和*需要转义String regex = subResult.replaceFirst("\\b+(?=[\\+\\*])", "\\\\");//把子表达式替换成计算结果result = result.replaceFirst(regex, simpleCalc(subResult));return recCalc(result);}}/*** 二目运算,两个数的加减乘除计算,使用BigDecimal的精确计算* @param repre 两个需要计算的数,中间带一个运算符* @return 返回计算结果,如果计算失败返回"未知错误!"* */private String simpleCalc(String repre) {//合法性校验if(!repre.matches(NUMBER + OPERS + NUMBER)) {return "未知错误1!";}//获取运算符Matcher m = Pattern.compile(OPERS).matcher(repre);m.find();String oper = m.group();//获取2个数字String[] nums = repre.split(OPERS);BigDecimal b1 = new BigDecimal(nums[0]);BigDecimal b2 = new BigDecimal(nums[1]);//精确计算switch (oper) {case "+" :return b1.add(b2).doubleValue()+"";case "-" :return b1.subtract(b2).doubleValue()+"";case "*" :return b1.multiply(b2).doubleValue()+"";case "/" :return b1.divide(b2, 20, BigDecimal.ROUND_HALF_UP).doubleValue()+"";default :return "未知错误2!";}}}

自己写了一整天,希望大佬能够指点一下,提供下示例代码也好啊
非常感谢!

java新手,写了个简单的计算器,求高手指点一二相关推荐

  1. java图形界面UI设计——简单的计算器

    java图形界面UI设计--简单的计算器# 可以实现连续的输入: java图形界面UI设计--简单的计算器下载

  2. C语言写的一个简单的计算器

    大学的第一学期就这样结束了.前阵子临近放假,不知道该干嘛,就分别用java和C语言写了两个东西.java写了个文件查找的程序.C语言写了个简易的计算器.至于为什么写计算器~因为刚学C语言的时候,还没摸 ...

  3. java计算年龄_java实现简单年龄计算器

    年龄计算器. 本文实例为大家分享了java实现简单年龄计算器的具体代码,供大家参考,具体内容如下 制作一个如下图年龄计算器 根据题目,我做了一个由Calendar类以及年月日各相减得到的年龄,当然正确 ...

  4. java swing 简单计算器_java用swing写了一个简单的计算器

    其实swing没什么难度,主要是字符串运算表达式,如何进行计算才能得到结果 swing界面5分钟,算法5小时 下面看具体代码 package frame; import java.awt.Border ...

  5. 简易计算器 java_终于写出一个简单的计算器了

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import javax.swing.*; import java.awt.event.*; import java.awt.*; import java ...

  6. 简单数学计算器求值(Python)

    思路: 数学计算式是中缀表达式,所以先把中缀表达式转换为后缀表达式,然后对后缀表达式进行求值. 中缀表达式: 在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表达式 ...

  7. java实现123n_用Java编程 :输入一个正整数n,输出n!的值。 其中n!=1*2*3*…*n。 求高手指点...

    展开全部 给你写了个程序可以实现,比如32313133353236313431303231363533e4b893e5b19e31333332643235在主函数输入5,则输出表示5!(120)的数组 ...

  8. eclipse启动mysql报错_Eclipse+mysql+java Eclipse中运行没有问题,但打包后运行不了,也不报错,求高手指点...

    这几天用Eclipse+mysql+java编写了一个班级信息管理的软件.在Eclipse里运行没有问题所有功能都没有问题,但无论用Eclipse中自带的export生成可执行的jar包,还是用fat ...

  9. python里面if语句一直出错_python错误,写了个小程序,if语句总是不执行,求高手指点...

    importwximportMySQLdbclassadddialog(wx.Frame):def__init__(self):self.frame=wx.Frame.__init__(self,No ...

最新文章

  1. 逗号操作符以及(0,function)()
  2. ucinet使用手册_ucinet使用手册
  3. 值传递与引用传递 c# 1613535799
  4. java从mysql中查数据_java怎么从数据库中查询数据并输出
  5. 蓝桥杯 ADV-117 算法提高 进制转换
  6. Atitit 面试分析--面试次数 复试次数 期望薪资分析法 目录 1. 汇总分析 面试次数 复试次数 期望薪资 1 2. 一些理论 1 2.1. 差额选举是指候选人数多于应选人数的选举。 1
  7. python制作中秋贺卡图片_中秋贺卡手工制作图片
  8. vue中echarts3d 使用(3d地图上有柱状图数据,吉林省)
  9. 回归方程的拟合优度检验_线性回归模型的拟合优度检验方法分析.ppt
  10. 关于触摸屏触摸驱动安装步骤
  11. Redis_04_Redis客户端
  12. java当前日期_Java 获取当前日期的四种方法
  13. 华硕AC56(8812)Linux网卡驱动安装教程
  14. 大文本文件打开工具_信息技术类专业常用工具软件教案1.1
  15. 视觉目标检测-05:使用目标区域的提取方法(手机iVcam与电脑iVcam之间相机的链接)
  16. EAP设备自动化系统基本功能与概念
  17. .py文件应该怎样打开?
  18. Android9.0 本地时区和本地时间的自动更新机制
  19. 11.编写COM常用IDL指令和注意事项详解
  20. DB-DAY1 梦想若在青春不老

热门文章

  1. OA之会议排座与送审
  2. 如何使用图片的exif信息计算相机焦距
  3. win10修改ntp服务器地址,修改win10 ntp服务器地址
  4. 读《沟通的方法》推荐序有感
  5. 黑白图片复原为彩色Picture Colorizer(图片着色器)
  6. 百度智能云怎样建立服务器,百度智能云服务器BCC系统盘扩容如何做
  7. ac86u原厂固件去广告_释放更多功能,华硕 AC86U 刷官改固件教程
  8. 滴滴D1上路之后,科技巨头正在“抢滩登陆“造车战场
  9. Python绘制地理图--Cartopy基础
  10. SEO主要是做什么的?零基础能学习吗?