在java中,我目前正在尝试通过在JTextField中键入文本,将其放入String并将其转换为int并求解来找到一种方法来进行数学求和。但问题是,我不想简单地将数字放入字符串中,而是将实际的总和包括加法,减法等。
目前它会接受只做类似的事情,1将从字符串转换为int,但当我执行'1 + 1'或甚至只是'1+'时它会抛出异常,因为'+'isn'一个数字。
我已经明白它不会工作因为int只允许数字。
有没有办法可以安全地在文本字段中输入一个完整的总和并以某种方式将其转换为int?比如输入7-2 * 5然后将答案保存在int?
中感谢。
答案 0 :(得分:2)
您可以使用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)
你想要的任何东西。
答案 1 :(得分:1)
这将为你做。
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<st.length();i++)
{
if(st.charAt(i)=='+')
{
result=Integer.parseInt(st.substring(0, i))+Integer.parseInt(st.substring(i+1, st.length()));
System.out.print(result);
}
}
答案 2 :(得分:0)
请参阅java.util.regex.Matcher或java.util.regex.Pattern 例如:
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类