`
奥义之舞
  • 浏览: 284406 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

    博客分类:
  • 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+"%");
		}
	}

}



通过以上的方法即可实现此方法。
以上转载自:http://ruyuntao.iteye.com/blog/406935
----------------------------------------------------------------------------
下面是算法实现的:
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);
	}

}


转载自:http://yafei.iteye.com/blog/725582
分享到:
评论
1 楼 zhou85xin 2014-12-04  
option = option.replaceAll(mapj.getKey(), mapj.getValue());

这个就不对,map中key如果contains,很容易就替换错了

相关推荐

    java算术表达式求值

    其次,"算术表达式求值 - 青年人,应该做怎样的青年人 - ITeye技术网站.htm" 和 "java字符串转换成算术表达式 - 刘亚飞 - ITeye技术网站.htm" 以及它们的"files"目录,很可能是两篇关于如何在Java中进行算术表达式求...

    java解释算术表达式

    1. **词法分析**:也称为扫描,是将输入的字符串(算术表达式)分解为一系列的标记(tokens)。这些标记可以是数字、运算符或特殊符号。例如,"2 + 3 * 4"会被分解为["2", "+", "3", "*", "4"]。 2. **语法分析**:...

    java 算术表达式求值器

    1. **字符串解析**:首先,我们需要将输入的字符串转换成可以处理的格式。这通常涉及到将字符串分割成数字和运算符,同时处理括号。我们可以使用正则表达式或自定义的分词算法来实现。 2. **运算符优先级**:定义...

    基于Java的实例源码-算术表达式计算类库 ExpressionJ.zip

    `Parser`类可能负责将字符串转换为AST,而`Evaluator`类则负责遍历AST并计算结果。通过查看这些类的实现,我们可以学习到如何使用Java的反射、泛型以及异常处理机制来实现这些功能。 总的来说,ExpressionJ提供了一...

    基于java的开发源码-算术表达式计算类库 ExpressionJ.zip

    【Java算术表达式计算类库 ExpressionJ】是专门为Java开发者设计的一个强大的工具,它能够解析和计算复杂的算术表达式。这个库的核心功能在于它能够解析字符串形式的数学表达式,并将其转换为可执行的代码,从而进行...

    利用栈来实现算术表达式自动计算

    在计算机科学中,处理算术表达式的计算是一个常见的任务,特别是...这些实现通常会涉及字符串处理、栈操作以及对运算符优先级的理解。通过熟练掌握这些方法,我们可以构建自己的计算器或编译器,处理复杂的数学表达式。

    数据结构课程设计算术表达式求解

    3. **表达式解析**:我们需要编写一个**词法分析器**和**语法分析器**来将输入的字符串转换为二叉树。词法分析器负责识别数字、运算符和括号等符号,语法分析器则根据运算符优先级规则构建二叉树。 4. **中缀表达式...

    数值运算字符串转换成数字.zip

    但这些函数并不能直接处理算术表达式,只能用于简单的数字字符串转换。 2. **存储过程**:由于标准SQL不提供直接解析和执行算术表达式的功能,你可能需要编写一个存储过程来实现这个功能。存储过程是一组预编译的...

    Java 解算术表达式

    在Java编程语言中,解析和计算算术表达式是一项常见的任务,特别是在开发涉及用户输入、数学计算或逻辑处理的应用程序时。在这个场景中,我们通常会利用数据结构,如栈(Stack),来辅助我们实现这一功能。栈是一种...

    带括号的算术表达式求值

    在编程实现中,可以使用C、C++、Java、Python等语言,通过创建运算符栈和数值栈,结合字符串处理和循环来实现这个算法。在实际应用中,如压缩包文件中的`calculator`程序,可能就是一个这样的实现。 总结来说,算符...

    Java算术表达式计算类库 ExpressionJ源码

    - 分析解析方法:理解如何将字符串转换为内部数据结构。 - 深入运算符处理:查看如何实现运算符优先级和括号规则。 - 调试和测试:通过运行示例,观察代码如何处理不同类型的表达式。 9. **应用场景**:...

    基于Java的算术表达式计算类库 ExpressionJ.zip

    这个库的核心功能在于能够接受一个字符串形式的算术表达式,并将其转换为可执行的对象,进而进行计算。这对于需要动态计算或者解析用户输入的程序来说,尤其有用。 ExpressionJ支持多种运算符,包括基本的加减乘除...

    java 用户输入加减乘除表达式运算

    3. **算术运算**:在解析完表达式后,我们使用`Double.parseDouble()`将字符串转换为`double`类型,然后执行相应的加、减、乘、除运算。Java提供了丰富的运算符支持,如`+`、`-`、`*`和`/`。 ```java double num1 =...

    数据结构(Java语言描述) 案例05 算术表达式求值.docx

    在计算机科学中,数据结构和算法是编程的基础,本案例聚焦于使用Java实现算术表达式求值,这是一个典型的栈应用问题。算术表达式求值涉及到中缀表达式和后缀表达式的转换以及运算符的优先级处理。 中缀表达式是我们...

    算术表达式计算器

    计算器的核心是解析器,它将输入的字符串形式的算术表达式转换为内部可执行的形式,如抽象语法树(AST)。解析过程中,可能会遇到诸如语法错误(比如丢失操作符或括号不匹配)和类型错误(比如尝试将数字与非数字...

    算术表达式的求值数据结构课程设计

    1. **算术表达式解析**:在计算机科学中,解析算术表达式是将字符串形式的表达式转换为可操作的数据结构的过程。这通常涉及到词法分析(将字符流分解成有意义的单词或符号)和语法分析(构建抽象语法树,AST)。 2....

    数据结构课程设计算术表达式的求解.doc

    问题描述可能涉及到如何将输入的字符串形式的算术表达式转换成可执行的计算步骤。这需要识别出表达式中的数字、运算符和括号,并根据运算符的优先级进行正确的计算。 2.2 运算符的优先级分析 在解析算术表达式时,...

    java正则实现解析算术表达式 (仅限+-*/和括号)

    在Java编程中,正则表达式(Regular Expression)是一种强大的文本处理工具,它可以用来匹配、查找、替换符合特定模式的字符串。在这个场景中,我们关注的是如何使用Java的正则表达式来解析简单的算术表达式,这些...

    EL表达式包括字符串处理,时间日期的格式化,数字处理

    例如,可以使用字符串对象的`.toLowerCase()`方法将字符串转换为小写。 示例: ```jsp 假设request中有名为name的字符串 --%&gt; ${name}".toLowerCase() %&gt; ``` ##### 3.2 时间日期的格式化 虽然EL本身并不直接支持...

    数据结构算术表达式求解.doc

    算术表达式求解器需要处理输入的字符串形式的表达式,然后将其转化为可执行的序列,这通常涉及到中缀表达式到后缀表达式的转换。 2.2 运算符的优先级分析: 在计算过程中,运算符的优先级至关重要。例如,乘法和除...

Global site tag (gtag.js) - Google Analytics