Java 字符串转换成算术表达式

今天遇到了一个需要将数据库中保存的表达式,替换其中的字符,并计算出值,java是不能直接计算的例如:

double d = (3+5-(2-4)*2)/24;没有问题

但是:遇到 "(3+5-(2-4)*2)/24" 字符串的格式,就不能使用了


java是无法解决,但是javaScript中有一个eval函数是可以执行的,所以,可以通过其他途径执行javaScript就可以做到,而ScriptEngine是java的一个javaScript实现类,所以就找到了方法,详细方法见下


public class MapJ {
private String key;//替换的编号
private String value;//值
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public MapJ(String key, String value) {
super();
this.key = key;
this.value = value;
}
public MapJ() {
super();
}

}


//实现类
import java.util.List;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class JavaScript {
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");

public Double getMathValue(List<MapJ> map,String option){
double d = 0;
try {
for(int i=0; i<map.size();i++){
MapJ mapj = map.get(i);
option = option.replaceAll(mapj.getKey(), mapj.getValue());
}
Object o = engine.eval(option);
d = Double.parseDouble(o.toString());
} catch (ScriptException e) {
System.out.println("无法识别表达式");
return null;
}
return d;
}
}


//测试
import java.util.ArrayList;
import java.util.List;

public class JavaScriptTest {

/**
* @param args
*/
public static void main(String[] args) {


String sbt = "(B+D-(A-C)*A)/F";
List<MapJ> all = new ArrayList<MapJ>();
all.add(new MapJ("A","2"));
all.add(new MapJ("B","3"));
all.add(new MapJ("C","4"));
all.add(new MapJ("D","5"));
all.add(new MapJ("F","24"));
JavaScript js = new JavaScript();
Double d = js.getMathValue(all, sbt);
if(d==null){
System.out.println(" 无法计算这个表达式");
}else{
System.out.println(d*100+"%");
}
}

}



通过以上的方法即可实现此方法。
以上转载自:[url]http://ruyuntao.iteye.com/blog/406935[/url]
----------------------------------------------------------------------------
下面是算法实现的:

package cn.anycall.test;

import java.math.BigDecimal;

public class TestSHU {

/**
* 两个字符类型的小数进行相加为a+b;
*
* @param a
* @param b
* @return
*/
public static String addBigDecimal(String a, String b) {
double a1 = Double.parseDouble(a);
double b1 = Double.parseDouble(b);
BigDecimal a2 = BigDecimal.valueOf(a1);
BigDecimal b2 = BigDecimal.valueOf(b1);
BigDecimal c2 = a2.add(b2);
String c1 = c2 + "";
return c1;
}
/**
* 两个字符类型的小数进行相减为a-b;
*
* @param a
* @param b
* @return
*/
public static String reduceBigDecimal(String a, String b) {
double a1 = Double.parseDouble(a);
double b1 = Double.parseDouble(b);
BigDecimal a2 = BigDecimal.valueOf(a1);
BigDecimal b2 = BigDecimal.valueOf(b1);
BigDecimal c2 = a2.subtract(b2);
String c1 = c2 + "";
return c1;
}
/**
* 两个字符类型的数相乘 a*b=c;
*
* @param a
* @param b
* @return
*/
public static String multipliedString(String a, String b) {
double a1 = Double.parseDouble(a);
double b1 = Double.parseDouble(b);
BigDecimal a2 = BigDecimal.valueOf(a1);
BigDecimal b2 = BigDecimal.valueOf(b1);
BigDecimal c2 = a2.multiply(b2);
String c1 = c2 + "";
return c1;
}
/**
* 两个字符类型的数相除 a/b=c;
*
* @param a
* @param b
* @return
*/
public static String divideString(String a, String b) {
double a1 = Double.parseDouble(a);
double b1 = Double.parseDouble(b);
BigDecimal a2 = BigDecimal.valueOf(a1);
BigDecimal b2 = BigDecimal.valueOf(b1);
BigDecimal c2 = a2.divide(b2,a2.scale());
String c1 = c2 + "";
return c1;
}

public static String yunsuanjibie(String s) {
String r = "";
int p = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '+' || s.charAt(i) == '-' || s.charAt(i) == '*'
|| s.charAt(i) == '/') {
p++;
}
}
String k[] = new String[2 * p + 1];
int k1 = 0;
int first = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '+' || s.charAt(i) == '-' || s.charAt(i) == '*'
|| s.charAt(i) == '/') {
k[k1] = s.substring(first, i);
k1++;
k[k1] = "" + s.charAt(i);
k1++;
first = i + 1;
}
}
k[k1] = s.substring(first, s.length());
int kp = p;
while (kp > 0) {
for (int i = 0; i < k.length; i++) {
if (k[i].equals("*") || k[i].equals("/")) {
int l;
for (l = i - 1; l > -1; l--) {
if (!(k[l].equals("p")))
break;
}
int q;
for (q = i + 1; q < k.length; q++) {
if (!(k[l].equals("p")))
break;
}
if (k[i].equals("*")) {
k[i] = ""+ multipliedString(k[l],k[q]);
k[l] = "p";
k[q] = "p";
kp--;
} else {
k[i] = ""+divideString(k[l],k[q]);
k[l] = "p";
k[q] = "p";
kp--;
}
break;
}
}
for (int i = 0; i < 2 * p + 1; i++) {
if (k[i].equals("+") || k[i].equals("-")) {
int l;
for (l = i - 1; l > -1; l--) {
if (!(k[l].equals("p")))
break;
}
int q;
for (q = i + 1; q < k.length; q++) {
if (!(k[q].equals("p")))
break;
}
if (k[i].equals("+")) {
k[i] = ""+addBigDecimal(k[l],k[q]);
k[l] = "p";
k[q] = "p";
kp--;
} else {
k[i] = ""+reduceBigDecimal(k[l],k[q]);
k[l] = "p";
k[q] = "p";
kp--;
}
break;
}
}
for (int i = 0; i < k.length; i++) {
if (!(k[i].equals("p"))) {
r = k[i];
break;
}
}
}
return r;
}

public static void sizeyunsuan(String s) {
while (true) {
int first = 0;
int last = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(')
first = i;
if (s.charAt(i) == ')') {
last = i;
break;
}
}
if (last == 0) {
System.out.println(yunsuanjibie(s));
return;
} else {
String s1 = s.substring(0, first);
String s2 = s.substring(first + 1, last);
String s3 = s.substring(last + 1, s.length());
s = s1 + yunsuanjibie(s2) + s3;
}
}
}

public static void main(String[] args) {
String s = "1.4+2*32/(3-2.1)";
sizeyunsuan(s);
}

}


转载自:[url]http://yafei.iteye.com/blog/725582[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值