免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6433 | 回复: 9
打印 上一主题 下一主题

能不能直接计算一个字符串表达式的值? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-24 18:01 |只看该作者 |倒序浏览
能不能直接计算一个字符串表达的值? 字符串是数学运算表达式
如: 1*2 + 1
String s1 = "1*2 + 1"

我现在想写一个函数以s1为input 参数,返回计算结果.

论坛徽章:
0
2 [报告]
发表于 2007-07-24 23:16 |只看该作者
如果是简单的表达式的话,可以自己用中序二叉树来写个解析器。或者买商业的代码库,比如:

http://www.singularsys.com/jep/doc/html/index.html

论坛徽章:
0
3 [报告]
发表于 2007-07-25 09:12 |只看该作者
原帖由 sakulagi 于 2007-7-24 23:16 发表
如果是简单的表达式的话,可以自己用中序二叉树来写个解析器。或者买商业的代码库,比如:

http://www.singularsys.com/jep/doc/html/index.html

只要不带特殊的操作付可以自己写,比如 三角函数,对数,积分。。。

论坛徽章:
0
4 [报告]
发表于 2007-07-25 11:33 |只看该作者
原帖由 sakulagi 于 2007-7-24 23:16 发表
如果是简单的表达式的话,可以自己用中序二叉树来写个解析器。或者买商业的代码库,比如:

http://www.singularsys.com/jep/doc/html/index.html

nod

论坛徽章:
0
5 [报告]
发表于 2007-07-25 13:23 |只看该作者
原帖由 sakulagi 于 2007-7-24 23:16 发表
如果是简单的表达式的话,可以自己用中序二叉树来写个解析器。或者买商业的代码库,比如:

http://www.singularsys.com/jep/doc/html/index.html


只是一些四则运算的数学表达式,没有其它特殊的数学函数,没有现成的类或函数直接处理吗? 很多其它开发语言都有相关的函数处理这些表达式,然后返回结果. java 自带的JDK应该也有吧?

[ 本帖最后由 hengpy 于 2007-7-25 13:25 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-07-25 13:50 |只看该作者
JDK里没有这样的API,只能自己写一个。一般脚本语言的类库多些,可能会有这样的方法。Java没有

论坛徽章:
0
7 [报告]
发表于 2007-07-25 14:01 |只看该作者
到 sf.net 找找, 再就是 google 搜索, 应该有这样的开源库.

论坛徽章:
0
8 [报告]
发表于 2007-07-25 21:41 |只看该作者
JDK 1.6 支持脚本编程
import javax.script.*;

/**
 * @author lovetide
 *
 */

public class JavaScriptingTest {
    public static void main(String[] args) throws Exception {
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName("JavaScript");

        if (args.length > 0) {
            Object ret = engine.eval(args[0]);
            System.out.println(ret.getClass().getName());
            System.out.println(ret);
        }else{
            System.out.println ("用法:");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println ("&nbsp;&nbsp;&nbsp;&nbsp;java JavaScriptingTest \"<Script Here>\"");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println ("示例:");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println ("&nbsp;&nbsp;&nbsp;&nbsp;java JavaScriptingTest \"1+2\"");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println ("&nbsp;&nbsp;&nbsp;&nbsp;java JavaScriptingTest \"(1+12)*3/4\"");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println ("&nbsp;&nbsp;&nbsp;&nbsp;java JavaScriptingTest \"Math.sqrt(2)\"");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println ("&nbsp;&nbsp;&nbsp;&nbsp;java JavaScriptingTest \"Math.sin(30/180*Math.PI)\"");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println ("&nbsp;&nbsp;&nbsp;&nbsp;java JavaScriptingTest \"Math.min((1+12)*3/4, 5.6)\"");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}

}


  1. E:\Test\Java\Eclipse\JavaScriptingTest>java JavaScriptingTest "1+2"
  2. java.lang.Double
  3. 3.0

  4. E:\Test\Java\Eclipse\JavaScriptingTest>java JavaScriptingTest "(1+12)*3/4"
  5. java.lang.Double
  6. 9.75

  7. E:\Test\Java\Eclipse\JavaScriptingTest>java JavaScriptingTest "Math.sin(Math.PI)"
  8. java.lang.Double
  9. 1.2246467991473532E-16

  10. E:\Test\Java\Eclipse\JavaScriptingTest>java JavaScriptingTest "Math.min((1+12)*3/4, 5.6)"
  11. java.lang.Double
  12. 5.6

  13. E:\Test\Java\Eclipse\JavaScriptingTest>java JavaScriptingTest "Math.sin(30)"
  14. java.lang.Double
  15. -0.9880316240928618

  16. E:\Test\Java\Eclipse\JavaScriptingTest>java JavaScriptingTest "Math.sin(Math.PI/6)"
  17. java.lang.Double
  18. 0.49999999999999994
复制代码




参考:
http://java.sun.com/
javase/6/docs/technotes/guides/scripting/programmer_guide/index.html

http://scripting.dev.java.net/

论坛徽章:
0
9 [报告]
发表于 2007-07-26 22:40 |只看该作者
lovetide  厉害!

论坛徽章:
0
10 [报告]
发表于 2012-07-27 11:13 |只看该作者
  1. import java.io.*;
  2. import javax.script.ScriptEngine;
  3. import javax.script.ScriptEngineManager;

  4. public class Main
  5. {
  6.         public static void main(String[] args) throws Exception
  7.         {
  8.                 String expr = "((2+4)/2+4)";
  9.                 ScriptEngineManager manager = new ScriptEngineManager();
  10.                 ScriptEngine engine = manager.getEngineByName("js");
  11.                 Object result = engine.eval(expr);
  12.                 System.out.println(result);
  13.         }
  14. }
复制代码
这个应该可以吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP