Java String来完成数学总和

在java中,我目前正在尝试通过在JTextField中键入文本,将其放入String并将其转换为int并求解来找到一种方法来进行数学求和。 但问题是,我不想简单地在字符串中加上一个数字 ,而是一个实际的总和,包括加法,减法等。

目前它会接受只做类似的事情,1将从字符串转换为int,但当我执行’1 + 1’或甚至只是’1+’时它会抛出exception,因为’+’不是数字。
我已经明白它不会工作因为int只允许数字。

有没有办法我可以安全地在文本字段中输入一个完整的总和并以某种方式将其转换为int? 喜欢输入7-2 * 5然后将答案保存在int中?

谢谢。

您可以使用JavaScript引擎:

 ScriptEngineManager mgr = new ScriptEngineManager(); ScriptEngine engine = mgr.getEngineByName("JavaScript"); String expression = textField.getText(); System.out.println(engine.eval(expression)); 

编辑以允许所有方程式:

所有你现在要做的就是允许像sin,cos,tan这样的东西:

 ScriptEngineManager mgr = new ScriptEngineManager(); ScriptEngine engine = mgr.getEngineByName("JavaScript"); String expression = textField.getText(); // Between here... expression = expression. replace("sin", "Math.sin"). replace("cos", "Math.cos"). replace("tan", "Math.tan"). replace("sqrt", "Math.sqrt"). replace("log", "Math.log"). replace("pi", "Math.PI"); // And so on... System.out.println(engine.eval(foo)); 

那么你可以这样做:

 5 + 5 - 2 / 5 + sin(55) - log(20) 

任何你想要的。

这将为你做到。

  import javax.script.ScriptEngineManager; import javax.script.ScriptEngine; public class Test { public static void main(String[] args) throws Exception{ ScriptEngineManager mgr = new ScriptEngineManager(); ScriptEngine engine = mgr.getEngineByName("JavaScript"); String foo = "40+2";//any mathematical operations +,-,*,/ System.out.println(engine.eval(foo)); } } 

在这里,您可以使用描述log / cos等函数的方法

 String st = "10+3"; int result; for(int i=0;i 

请参阅java.util.regex.Matcher或java.util.regex.Pattern对于ex:

 import java.util.regex.Matcher; import java.util.regex.Pattern; public class IpDnsValidateUtils { public static final int MAX_DNS_LEN = 39; private static final Pattern ptrnIp = Pattern .compile("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"); private static final Pattern ptrnDomainName = Pattern .compile("^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])(\\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])){0,}[.][a-zA-Z]{2,5}$"); public static boolean isValidIp(String value, boolean emptyTrue) { boolean ret = false; if (!value.isEmpty() || !emptyTrue) { Matcher m = ptrnIp.matcher(value); ret = m.matches(); } else { ret = true; } return ret; } public static boolean isValidDns(String value, boolean emptyTrue) { boolean ret = false; if (!value.isEmpty() || !emptyTrue) { Matcher m = ptrnDomainName.matcher(value); ret = m.matches(); } else { ret = true; } return ret; } } 

或StringTokenizer类