Java 将已声明变量的字符串(例如“x+;y”作为数学函数转换为double
我试图做的是读取一行(字符串)并将其用作数学函数,以在不同点获得(双)值或答案(基本上像计算器) 为了直截了当,我加入了一个非常简单的代码:Java 将已声明变量的字符串(例如“x+;y”作为数学函数转换为double,java,Java,我试图做的是读取一行(字符串)并将其用作数学函数,以在不同点获得(双)值或答案(基本上像计算器) 为了直截了当,我加入了一个非常简单的代码: double x, y, z; String function; x = 5; y = 4; function = "(x*y)+y"; z = Double.parseDouble(function); /* I want z to equal this z = (x*y)+y; */ System.out.print("z= " + z); 同
double x, y, z;
String function;
x = 5;
y = 4;
function = "(x*y)+y";
z = Double.parseDouble(function);
/*
I want z to equal this
z = (x*y)+y;
*/
System.out.print("z= " + z);
同样,这只是一个示例代码,可以更清楚地说明我的问题。我的问题是:当z是一个双精度函数,而函数是一个字符串时,如何设置z=function
注意:正如您所看到的,我尝试了解析,但没有成功。我还尝试逐个字符读取字符串,但也不起作用,因为它将字符的值加在了一起。我猜您正在查找a和a 这些是每个编译器或解释器的基本组件
- lexer能够将输入(字符串)拆分为令牌
- 解析器能够构建一棵树,它表示要进一步进行语义解释的标记的语法形状
如果您想忘记所有这些理论,只需在Java程序中嵌入JavaScript或Groovy之类的东西,它们就能够解释运行时给出的代码,这样您就可以这样做。我猜您正在寻找一个和一个 这些是每个编译器或解释器的基本组件
- lexer能够将输入(字符串)拆分为令牌
- 解析器能够构建一棵树,它表示要进一步进行语义解释的标记的语法形状
如果您想忘记所有这些理论,只需在Java程序中嵌入JavaScript或Groovy之类的东西,它们就能够解释运行时给出的代码,这样您就可以这样做。Java没有类似于
eval
的内置功能。但是你可以使用一种表达语言,比如,或者
也许这个问题可以帮助你们。Java并没有像
eval
这样的内置代码。但是你可以使用一种表达语言,比如,或者
也许这个问题可以帮助你们。我建议你们看看。与几乎所有其他Java解析器解决方案不同,您编写语法。。。在Java中
此外,在Java示例中,还有。我建议您看看。与几乎所有其他Java解析器解决方案不同,您编写语法。。。在Java中 此外,在Java示例中,还有。
float eval(String exp)
{
char[]a=exp.toCharArray();
float[]buffer=新整数[exp.length];
int k=0;
对于(int i:a)
{
如果(a[i]>=48&&a[i]float eval(字符串exp)
{
char[]a=exp.toCharArray();
float[]buffer=新整数[exp.length];
int k=0;
对于(int i:a)
{
如果(a[i]>=48&&a[i]你需要为此编写一个解析器。Java没有eval
…你需要为此编写一个解析器。Java没有eval
…也有parboiled。parboiled也有一个工作计算器示例;)也有parboiled。parboiled也有一个工作计算器示例;)
float eval(String exp)
{
char[] a = exp.toCharArray();
float[] buffer = new int[exp.length];
int k = 0;
for(int i : a)
{
if(a[i] >= 48 && a[i] <= 57) //checking for numbers
{
int x = a[i] - '0';
buffer[k++] = x;
}
else if(a[i] == '+' || a[i] == '-' || a[i] == '*' || a[i] == '/') //checking for operands
{
float result;
switch(a[i])
{
case '+': result = buffer[k] + buffer[k-1]; break;
case '-': result = buffer[k] - buffer[k-1]; break;
case '*': result = buffer[k] * buffer[k-1]; break;
case '/': result = buffer[k] / buffer[k-1]; break;
}
}
buffer[k++] = result;
}
return buffer[k]; //finally returning the recent value
}