我需要将我作为字符串存储在资源 xml 中的正方形周长 (4*a) 之类的公式分配给我的活动中的一个值。所以,它应该看起来像:
活动:
int a = (formula from xml)
和 XML:
<resources>
<string name="square_perimeter">4*a</string>
</resources>
有没有办法做到这一点?
是什么[34 20 2A 20 31 36]
?
这是计算机遇到字符串时会看到的内容"4 * 16"
。就像你一样,当只给它时,它不知道为什么那些神秘的数字应该等于 64。
因此,要真正评估这一点,计算机/算法将从将输入分成块开始。假设您的表达式必须用空格分隔(4*4
是非法的,4 * 4
没关系)。基于这些知识,我们可以将表达式拆分为[34]
, [2A]
, [31 36]
。
[34]
代表4
数字的字符=>该部分表示4[2A]
代表作为*
数学运算符的字符 => 我们需要将这之前的部分与之后的部分相乘。[31 36]
代表1
and 6
,两者都是数字。=> 计算 1 * 10 + 6 => 是 16。我们知道此时必须进行乘法运算,并且我们有 4 和 16,因此可以计算 4*16 并得到结果。
如果您只需要遵循严格规则的非常简单的公式,例如只有“[numbers] [*/+-] [numbers]”,那么为此编写一个小型解析器非常简单。
但是数学很快就会变得复杂,并且“10 + 5 * 2”已经要求如果您从左到右进行评估,则不要添加 10 + 5,因为这将是错误的结果。
因此,使用类似变量评估复杂表达式需要编写的代码量"5a^2 * sin(a) +1"
相当大。它需要涵盖所有数学规则和所有特殊情况。
回到你的问题:如果你真的想使用文本公式,寻找一个可以为你做丑陋东西的库。例如,评估以字符串形式给出的数学表达式会提到一些。
如果您不需要将公式作为文本,您可以这样做:
您将方法名称放在 xml 数据库中,并在您的应用程序中实现该方法的解决方案。用户通过名称选择方法,然后您根据该名称调用正确的方法。缺点是必须知道所有公式,以便您可以编写一段代码来解决它。
非常基本的例子:
public int calculate(String method, int value1, int value2) {
if ("square".equals(method)) {
return value1 * value1;
} else if ("add".equals(method)) {
return value1 + value2;
} else if ("substract".equals(method)) {
return value1 - value2;
} else {
return 0;
}
}
公式中使用的值也需要在某个地方出现,我不知道您打算如何做到这一点。