Java解析四则算式工具类

selling-dreams 2019-06-19 04:38:27
import java.text.DecimalFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
* 描述:解析四则算式并计算
* @author
* @date 2019年06月18日 16:48:26
* @since
*/
public class Math {
// 全局正则定义
/**
* 乘除正则,查找乘除操作
*/
private static String mul_div_calc_regex = "\\d+(\\.\\d+)?[\\*\\/]\\d+(\\.\\d+)?";
/**
* 加减正则,查找加减操作
*/
private static String plus_sub_calc_regex = "\\d+(\\.\\d+)?[\\+\\-]\\d+(\\.\\d+)?";
/**
* 括号正则,查找括号运算
*/
private static String mark_regex = "\\([^\\(]*?\\)";
/**
* 运算正则,查找具体操作
*/
private static String calc_regex = "[\\+\\-\\*\\/]";

/**
* 功能描述:简单计算
* @author
* @date 2019年06月18日 17:50:25
* @param a
* @param mark
* @param b
* @return java.lang.String
*/
public static String basic_calc(String a, String mark, String b){
double v1 = Double.parseDouble(a);
double v2 = Double.parseDouble(b);
String ans = "";
if("*".equals(mark)){
ans = String.valueOf(Arith.mul(v1, v2));
}else if("/".equals(mark)){
ans = String.valueOf(Arith.div(v1, v2));
}else if("+".equals(mark)){
ans = String.valueOf(Arith.add(v1, v2));
}else if("-".equals(mark)){
ans = String.valueOf(Arith.sub(v1, v2));
}
return ans;
}

/**
* 功能描述:字符串拆分计算
* @author
* @date 2019年06月18日 17:50:40
* @param s
* @return java.lang.String
*/
public static String calc_by_string(String s){
// 判断是否以"-"开头
boolean isNegative = false;
if(s.startsWith("-")){
s = s.substring(1);
isNegative = true;
}
String[] arr = s.split(calc_regex);
Pattern pattern = Pattern.compile(calc_regex);
Matcher matcher = pattern.matcher(s);
String mark = "";
while (matcher.find()){
mark = matcher.group();
}
if(isNegative){
arr[0] = "-"+arr[0];
}
return basic_calc(arr[0], mark, arr[1]);
}

/**
* 功能描述:查找字符串中乘除操作,并计算
* @author
* @date 2019年06月18日 17:50:54
* @param s
* @return java.lang.String
*/
public static String mul_div(String s){
String ans = "";
String a = "";
Pattern pattern = Pattern.compile(mul_div_calc_regex);
Matcher matcher = null;
while (pattern.matcher(s).find()) {
matcher = pattern.matcher(s);
while (matcher.find()) {
a = matcher.group();
ans = calc_by_string(a);
s = s.replace(a, ans);
}
}
return s;
}

/**
* 功能描述:查找字符串中加减操作,并计算
* @author
* @date 2019年06月18日 17:51:04
* @param s
* @return java.lang.String
*/
public static String plus_sub(String s){
// 判断是否以"-"开头
boolean isNegative = false;
String ans = "";
String a = "";
Pattern pattern = Pattern.compile(plus_sub_calc_regex);
Matcher matcher = null;
while (pattern.matcher(s).find()) {
matcher = pattern.matcher(s);
while (matcher.find()) {
if(s.startsWith("-")){
isNegative = true;
}
a = matcher.group();
if(isNegative){
a = "-"+a;
}
ans = calc_by_string(a);
s = s.replace(a, ans);
isNegative = false;
}
}
return s;
}

/**
* 功能描述:计算一个简单等式,不包含括号
* @author
* @date 2019年06月18日 17:51:14
* @param s
* @return java.lang.String
*/
public static String calc_one(String s){
return plus_sub(mul_div(s));
}

/**
* 功能描述:查找括号,并计算
* @author
* @date 2019年06月18日 17:51:25
* @param s
* @return java.lang.String
*/
public static String mark_calc(String s){
String ans = "";
String a = "";
Pattern pattern = Pattern.compile(mark_regex);
Matcher matcher = null;
while (pattern.matcher(s).find()) {
matcher = pattern.matcher(s);
while (matcher.find()) {
a = matcher.group();
ans = calc_one(a.substring(1, a.length()-1));
// *和/之间是否夹杂-,并对其做处理
if(ans.indexOf("*")!=-1||ans.indexOf("/")!=-1){
if(ans.split("-").length%2==0){
ans = ans.replace("-", "");
ans = "-"+ans;
}else{
ans = ans.replace("-", "");
}
}
s = s.replace(a, ans);
}
}
// 对--和+-做处理
s = s.replace("+-", "-");
s = s.replace("--", "+");
return s;
}

/**
* 功能描述:全部计算
* @author
* @date 2019年06月18日 17:51:35
* @param s
* @return java.lang.String
*/
public static String calc_all(String s){
DecimalFormat df = new DecimalFormat("0.00");
// 去除s中的空格
s = s.replace(" ","");
String value = plus_sub(mul_div(mark_calc(s)));
return df.format(Double.parseDouble(value));
}
/***********************************************************/
/***********************************************************/
import java.math.BigDecimal;

/**
* 描述:精确的浮点数运算
*
* @author
* @date
* @since
*/
public class Arith
{

/** 默认除法运算精度 */
private static final int DEF_DIV_SCALE = 10;

/** 这个类不能实例化 */
private Arith()
{
}

/**
* 提供精确的加法运算。
* @param v1 被加数
* @param v2 加数
* @return 两个参数的和
*/
public static double add(double v1, double v2)
{
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2).doubleValue();
}

/**
* 提供精确的减法运算。
* @param v1 被减数
* @param v2 减数
* @return 两个参数的差
*/
public static double sub(double v1, double v2)
{
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue();
}

/**
* 提供精确的乘法运算。
* @param v1 被乘数
* @param v2 乘数
* @return 两个参数的积
*/
public static double mul(double v1, double v2)
{
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2).doubleValue();
}

/**
* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
* 小数点以后10位,以后的数字四舍五入。
* @param v1 被除数
* @param v2 除数
* @return 两个参数的商
*/
public static double div(double v1, double v2)
{
return div(v1, v2, DEF_DIV_SCALE);
}

/**
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
* 定精度,以后的数字四舍五入。
* @param v1 被除数
* @param v2 除数
* @param scale 表示表示需要精确到小数点以后几位。
* @return 两个参数的商
*/
public static double div(double v1, double v2, int scale)
{
if (scale < 0)
{
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
if (b1.compareTo(BigDecimal.ZERO) == 0)
{
return BigDecimal.ZERO.doubleValue();
}
return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}

/**
* 提供精确的小数位四舍五入处理。
* @param v 需要四舍五入的数字
* @param scale 小数点后保留几位
* @return 四舍五入后的结果
*/
public static double round(double v, int scale)
{
if (scale < 0)
{
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(v));
BigDecimal one = new BigDecimal("1");
return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
...全文
100 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
selling-dreams 2019-06-19
  • 打赏
  • 举报
回复
已经测试过。
中文编程系统化教程初级1学习编程捷径:(不论是正在学习编程的大学生,还是IT人士或者是编程爱好者,在学习编程的过程中用正确的学习方法可以达到事半功倍的效果。对于初学者,可以通过下面的方法学习编程,通过对成百上千个实例练习,则很快会成为编程高手。我们专业从事编程十几年,积累了丰富的编程经验,会陆续制作编程视频供大家学习,中级、高级编程我们会专门制作中高级的系列编程课程,难度逐步加深,想学编程的可以关注我们的系列课程。可以就相关编程问题提问。1、【编程工具分为 免费自由版、专业版、企业版。】首先通过免费自由版熟悉基本操作,通过我们提供的实例视频学习编程,先快速入门。2、基本入门后,再学习我们提供的中级编程课程,通过对若干实例的编程练习,基本可以掌握编程思路。3、想继续加深学习的,可以继续学习高级版编程课程,通过对连接数据库等的学习真正开发出实用的商业管理软件或定制开发程序。4、基本掌握了编程思路之后,再学习其他的编程语言或大学里的编程课程则会非常轻松,因为不论是哪个编程语言,最重要的是学习编程思路,而编程思路基本上是相通的。5、学习完PC电脑端编程后,还可以继续学习APP手机软件开发。APP手机软件开发需要有PC电脑上开发基础,操作基本类似。6、编程工具为 搭建之星,这个编程工具的特点:1、安装简单、迅速,纯中文界面,构件丰富,设计过程直观、自由;无需掌握电脑语言,所有编程构件化、命令化、可视化。2、交互式开发,只需要四种类型的“命令”,便可以建立各构件之间的联系;象搭积木一样简单,并可快速的搭建出具有专业水平的软件作品。3、微解释执行,命令解释量小,执行速度快。可以和编译后的可执行文件相媲美。4、提供打包工具,使您即刻将自制软件安装到其它机器上运行。5、自动对开发项目进行加密;使您的项目,在未经授权下,别人无法“浏览、修改”项目的构件关系与搭建方法。课程安排:初级11  初级概述2  熟悉构件取值赋值3 折叠式菜单滑动面板编程4 自定义图形窗口自定义标题栏编程5 多行文本分段显示编程6 调用外部exe文件关闭外部exe文件编程7 给自己编写的项目设置密码8 制作一个计算器编程9 图片浏览编程10 看图软件编程11 配置文件读写编程12密码验证登录编程13软件启动窗口编程14增加软件工具条菜单15调色板编程16随机算式编程17螳螂捕蝉多窗口显示编程18 删除指定的字符行编程19计算表达式编程20扩展系统菜单21时间计算秒级计算编程22数值范围判断编程23数值比较取中间值编程24随机抽取编程25锁定窗口编程26文件拷贝显示进度条编程27项目间传递参数公用数据编程28项目间传递参数执行文件编程29字符串截取编程30多媒体实例澳门介绍编程31电影播放软件编程32初级1总结【使用这个编程工具开发的部分实际案例】   

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧