java实现字符串四则运算公式解析工具类的方法
作者:零度anngle 发布时间:2021-11-03 09:22:23
标签:java,字符串,工具类
项目中用到用户定义运算公式进行就算的需求,这样需要进行字符串四则运算解析,下面提供字符串公式四则运算解析与计算工具类,需要的同学可参考。
工具类如下:FormulaCalculator.java:
package org.nercita.bcp.record.util;
import java.util.ArrayList;
import java.util.LinkedList;
/**
* @author zhangwenchao
* @since 2016-08-26
* 公式计算的工具类
*/
public class FormulaCalculator {
private static boolean isRightFormat = true;
public static double getResult(String formula){
double returnValue = 0;
try{
returnValue = doAnalysis(formula);
}catch(NumberFormatException nfe){
System.out.println("公式格式有误,请检查:" + formula);
}catch(Exception e){
e.printStackTrace();
}
if(!isRightFormat){
System.out.println("公式格式有误,请检查:" + formula);
}
return returnValue;
}
private static double doAnalysis(String formula){
double returnValue = 0;
LinkedList<Integer> stack = new LinkedList<Integer>();
int curPos = 0;
String beforePart = "";
String afterPart = "";
String calculator = "";
isRightFormat = true;
while(isRightFormat&&(formula.indexOf('(') >= 0||formula.indexOf(')') >= 0)){
curPos = 0;
for(char s : formula.toCharArray()){
if(s == '('){
stack.add(curPos);
}else if(s == ')'){
if(stack.size() > 0){
beforePart = formula.substring(0, stack.getLast());
afterPart = formula.substring(curPos + 1);
calculator = formula.substring(stack.getLast() + 1, curPos);
formula = beforePart + doCalculation(calculator) + afterPart;
stack.clear();
break;
}else{
System.out.println("有未关闭的右括号!");
isRightFormat = false;
}
}
curPos++;
}
if(stack.size() > 0){
System.out.println("有未关闭的左括号!");
break;
}
}
if(isRightFormat){
returnValue = doCalculation(formula);
}
return returnValue;
}
private static double doCalculation(String formula) {
ArrayList<Double> values = new ArrayList<Double>();
ArrayList<String> operators = new ArrayList<String>();
int curPos = 0;
int prePos = 0;
int minus = 0;
for (char s : formula.toCharArray()) {
if ((s == '+' || s == '-' || s == '*' || s == '/') && minus !=0 && minus !=2) {
values.add(Double.parseDouble(formula.substring(prePos, curPos).trim()));
operators.add("" + s);
prePos = curPos + 1;
minus = minus +1;
}else{
minus =1;
}
curPos++;
}
values.add(Double.parseDouble(formula.substring(prePos).trim()));
char op;
for (curPos = 0; curPos <= operators.size() - 1; curPos++) {
op = operators.get(curPos).charAt(0);
switch (op) {
case '*':
values.add(curPos, values.get(curPos) * values.get(curPos + 1));
values.remove(curPos + 1);
values.remove(curPos + 1);
operators.remove(curPos);
curPos = -1;
break;
case '/':
values.add(curPos, values.get(curPos) / values.get(curPos + 1));
values.remove(curPos + 1);
values.remove(curPos + 1);
operators.remove(curPos);
curPos = -1;
break;
}
}
for (curPos = 0; curPos <= operators.size() - 1; curPos++) {
op = operators.get(curPos).charAt(0);
switch (op) {
case '+':
values.add(curPos, values.get(curPos) + values.get(curPos + 1));
values.remove(curPos + 1);
values.remove(curPos + 1);
operators.remove(curPos);
curPos = -1;
break;
case '-':
values.add(curPos, values.get(curPos) - values.get(curPos + 1));
values.remove(curPos + 1);
values.remove(curPos + 1);
operators.remove(curPos);
curPos = -1;
break;
}
}
return values.get(0).doubleValue();
}
public static void main(String[] args) {
System.out.println(FormulaCalculator.getResult("3-(4*5)+5"));
System.out.println(FormulaCalculator.getResult("7/2-(-4)"));
System.out.println(FormulaCalculator.getResult("1287763200000-1276272000000")/(3600*24*1000));
}
}
支持四则运算,同时支持负数解析。
另附,小数数据保留位数工具类,SetNumberPrecision.java
package org.nercita.bcp.record.util;
import java.text.DecimalFormat;
/**
* @author zhangwenchao
* 小数点 精度的工具类
*/
public class SetNumberPrecision {
public static String setNumberPrecision(double x,int Number){
String p="#########0";
if(Number==0){
p="#########0";
}else{
p="#########0.";
for(int i=0;i<Number;i++){//for的巧妙运用
p=p+"0";
}
}
DecimalFormat f = new DecimalFormat(p);
String s = f.format(x).toString();
return s;
}
}
来源:https://blog.csdn.net/zmx729618/article/details/52328377


猜你喜欢
- java输入流报错:Exception in thread "main" java.util.NoSuchElement
- 本文实例讲述了Android编程实现画板功能的方法。分享给大家供大家参考,具体如下:Android实现画板主要有2种方式,一种是用自定义Vi
- 今天,基基,跟大家分享一下,IntelliJ IDEA 2021 Win 和 Mac 快捷键大全,IDEA 基本所有功能都可以通过快捷键来完
- refresh()该方法是 Spring Bean 加载的核心,它是 ClassPathXmlApplicationContext 的父类
- 废话不多说了,直接给大家贴代码了。package com.only.android.app;import java.io.File;impo
- 本文实例为大家分享了spring aop注解配置的具体代码,供大家参考,具体内容如下Demo.javapackage cn.itcast.e
- 介绍了图的最小生成树的概念,然后介绍了求最小生成树的两种算法:Prim算法和Kruskal算法的原理,最后提供了基于邻接矩阵和邻接链表的图对
- 一、原因:forceclose,意为强行关闭,当前应用程序发生了冲突。NullPointExection(空指针),IndexOutOfBo
- Hystrix 是一个帮助解决分布式系统交互时超时处理和容错的类库, 它同样拥有保护系统的能力。Netflix的众多开源项目之一。设计流程:
- ExpandoObject:表示一个对象,该对象包含可在运行时动态添加和移除的成员。 dynamic dynEO = new Expando
- 压缩包制作也是很多项目中需要用到的功能。比如有大量的文件(假设有10000个)需要上传,1个1个的上传似乎不太靠谱(靠,那得传到什么时候啊?
- 在Spring MVC中经常要用到 * ,在配置需要要拦截的路径时经常用到<mvc:mapping/>子标签,其有一个path属
- java 闰年判断前言:给定一个年份,判断这一年是不是闰年。当以下情况之一满足时,这一年是闰年:1. 年份是4的倍数而不是100的倍数;2.
- 本文介绍一个app最常见的特性,就是新功能属性介绍和启动屏,一般会怎么实现呢,这不就打算告诉大家了么。先说逻辑先判断是否第一次启动app,如
- VC程序设计中屏幕上的文字大都是由gdi32.dll的以下几个函数显示的:TextOutA、TextOutW、ExtTextOutA、Ext
- 前言:在java开发中我们肯定会大量的使用集合,在这里我将总结常见的集合类,每个集合类的优点和缺点,以便我们能更好的使用集合。下面我用一幅图
- 前言最近在阅读 .NET Threadpool starvation, and how queuing makes it worse 这篇博
- 源码:[StructLayout(LayoutKind.Explicit)] public struct IP {&nb
- 回调函数就像activities一样,fragments也有它们自己的生命周期。理解fragments的生命周期,可以使你在它们被销毁的时候
- 目录@Configuration + @Bean@Componet + @ComponentScan@Import注解导入@Import直接