java實(shí)現(xiàn)字符串四則運(yùn)算公式解析工具類(lèi)的方法
項(xiàng)目中用到用戶(hù)定義運(yùn)算公式進(jìn)行就算的需求,這樣需要進(jìn)行字符串四則運(yùn)算解析,下面提供字符串公式四則運(yùn)算解析與計(jì)算工具類(lèi),需要的同學(xué)可參考。
工具類(lèi)如下:FormulaCalculator.java:
package org.nercita.bcp.record.util;
import java.util.ArrayList;
import java.util.LinkedList;
/**
* @author zhangwenchao
* @since 2016-08-26
* 公式計(jì)算的工具類(lèi)
*/
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("公式格式有誤,請(qǐng)檢查:" + formula);
}catch(Exception e){
e.printStackTrace();
}
if(!isRightFormat){
System.out.println("公式格式有誤,請(qǐng)檢查:" + 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("有未關(guān)閉的右括號(hào)!");
isRightFormat = false;
}
}
curPos++;
}
if(stack.size() > 0){
System.out.println("有未關(guān)閉的左括號(hào)!");
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));
}
}
支持四則運(yùn)算,同時(shí)支持負(fù)數(shù)解析。
另附,小數(shù)數(shù)據(jù)保留位數(shù)工具類(lèi),SetNumberPrecision.java
package org.nercita.bcp.record.util;
import java.text.DecimalFormat;
/**
* @author zhangwenchao
* 小數(shù)點(diǎn) 精度的工具類(lèi)
*/
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的巧妙運(yùn)用
p=p+"0";
}
}
DecimalFormat f = new DecimalFormat(p);
String s = f.format(x).toString();
return s;
}
}
以上這篇java實(shí)現(xiàn)字符串四則運(yùn)算公式解析工具類(lèi)的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Java三目運(yùn)算中隱藏的自動(dòng)拆裝箱
- 淺談Java三目運(yùn)算
- Java利用移位運(yùn)算將int型分解成四個(gè)byte型的方法
- Java使用BigDecimal進(jìn)行運(yùn)算封裝的實(shí)際案例
- Java中比較運(yùn)算符compareTo()、equals()與==的區(qū)別及應(yīng)用總結(jié)
- java代碼執(zhí)行字符串中的邏輯運(yùn)算方法
- Java 字符串轉(zhuǎn)float運(yùn)算 float轉(zhuǎn)字符串的方法
- Java編程實(shí)現(xiàn)對(duì)十六進(jìn)制字符串異或運(yùn)算代碼示例
- 詳解Java中運(yùn)算符及用法
- Java利用三目運(yùn)算符比較三個(gè)數(shù)字的大小
相關(guān)文章
Spring Boot Swagger2使用方法過(guò)程解析
這篇文章主要介紹了Spring Boot Swagger2使用方法過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
Java實(shí)現(xiàn)簡(jiǎn)單文件過(guò)濾器功能
下面小編就為大家分享一篇Java實(shí)現(xiàn)簡(jiǎn)單文件過(guò)濾器功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
ReentrantLock實(shí)現(xiàn)原理詳解
本文將對(duì)ReentrantLock實(shí)現(xiàn)原理進(jìn)行詳細(xì)的介紹,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02
java實(shí)現(xiàn)的統(tǒng)計(jì)字符算法示例
這篇文章主要介紹了java實(shí)現(xiàn)的統(tǒng)計(jì)字符算法,涉及java針對(duì)字符的遍歷、判斷、運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下2017-10-10
Java集合框架之Stack Queue Deque使用詳解刨析
早在 Java 2 中之前,Java 就提供了特設(shè)類(lèi)。比如:Dictionary, Vector, Stack, 和 Properties 這些類(lèi)用來(lái)存儲(chǔ)和操作對(duì)象組。雖然這些類(lèi)都非常有用,但是它們?nèi)鄙僖粋€(gè)核心的,統(tǒng)一的主題。由于這個(gè)原因,使用 Vector 類(lèi)的方式和使用 Properties 類(lèi)的方式有著很大不同2021-10-10
java微信開(kāi)發(fā)第二步 獲取消息和回復(fù)消息
這篇文章主要為大家分享java微信開(kāi)發(fā)的第二步,如何獲取消息和回復(fù)消息,感興趣的小伙伴們可以參考一下2016-05-05
MyBatis在insert插入操作時(shí)返回主鍵ID的配置(推薦)
這篇文章主要介紹了MyBatis在insert插入操作時(shí)返回主鍵ID的配置的相關(guān)資料,需要的朋友可以參考下2017-10-10
基于javaWeb 項(xiàng)目SSM配置要點(diǎn)及可能遇到的問(wèn)題和解決方法
下面小編就為大家?guī)?lái)一篇基于javaWeb 項(xiàng)目SSM配置要點(diǎn)及可能遇到的問(wèn)題和解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
Java實(shí)現(xiàn)List去重的五種方法詳解
這篇文章主要為大家詳細(xì)介紹了Java中List去重的5種方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)和參考價(jià)值,需要的小伙伴可以了解一下2022-10-10

