如何解决如何用犀牛脚本处理百分比?
我正在制作一个计算器应用程序,它基本上构建了一个使用 rhino 处理方程的字符串。但问题是我找不到处理百分比的方法。它不接受 % 符号。
我需要用“?/100*?”替换它的所有实例在字符串中,其中 ?st 是百分比前面的数字和与百分比一起使用的 ?nd 数字。
示例 "5 + 3% + 2" --> "5 + 5/100*3 + 2" .
问题是我不知道可以预期什么样的数字,甚至可能是 (5+4)-(3+1)% 或长小数。由于百分比在字符串内,我不使用变量。 这是下面的示例(按下等于按钮时调用的方法):
btnEquals.setonClickListener(v -> {
process = tvInput.getText().toString();
process = process.replaceAll("%","?/100*?"); // this is the problem line
rhinoAndroidHelper = new RhinoAndroidHelper(this);
context = rhinoAndroidHelper.enterContext();
context.setoptimizationLevel(-1);
String finalResult = "";
try {
Scriptable scriptable = context.initStandardobjects();
finalResult = context.evaluateString(scriptable,process,"javascript",1,null).toString();
} catch (Exception e) {
finalResult = "0";
}
tvOutput.setText(finalResult);
tvInput.setText("");
});
我正在使用这个辅助库:https://github.com/F43nd1r/rhino-android
我没有使用犀牛的经验,所以我不知道是否有简单的解决方案。我认为唯一的解决方案是构建一个复杂的字符串解析方法,该方法将检查百分比之前的内容并对其进行重新格式化。关于犀牛还有其他办法吗?
这里是我写的一个字符串格式化方法。它可以正确处理任何包含单个 % 的方程:
private void format(String s){
int newIndex = s.indexOf("%");
int nextIndex = newIndex;
StringBuilder percentage = new StringBuilder();
StringBuilder value = new StringBuilder();
char character;
String result = "";
StringBuilder newProcess = new StringBuilder(s);
boolean done = true;
boolean firstPartDone = false;
boolean firstSymbol = false;
while(done){
while (!firstPartDone){
if(nextIndex == 0){
done = false;
}
nextIndex--;
character = s.charat(nextIndex);
if(character == '+' | character == '/' | character == '*' | character == '-'){
firstPartDone = true;
}else{
percentage.insert(0,character);
}
}
if(nextIndex == 0){
done = false;
}
character = s.charat(nextIndex);
if(character == '+' | character == '/' | character == '*' | character == '-'){
if(!firstSymbol){
// value.insert(0,character);
nextIndex--;
firstSymbol = true;
}else{
done = false;
}
}else{
value.insert(0,character);
nextIndex--;
}
}
// percentage.append("%");
System.out.println(percentage);
System.out.println(value);
result = value + "/100*" + percentage;
String percent = percentage.toString();
String percentToReplace = percent.concat("%");
String finalString = newProcess.toString();
finalString = finalString.replace(percentToReplace,result);
process = finalString;
}
上述方法的问题在于它仍然缺少对检测和处理括号(如 (5+4)-(4+2)% )的支持。我可以写。但是当存在两个 % 时它会出错。 例如: 5+10%-4+50% 将变成 5+ 5/10010 - 4 + 4/10050 。 由于某种原因,上述等式最终会产生不好的结果。必要的是包含括号等。 我只是希望有更简单的方法。
解决方法
Rhino 是一个不支持 DOM 的 JavaScript 引擎。如果 vanilla javascript 能做到,Rhino 也能做到。
由于 % 的含义取决于上下文,我认为没有任何简单的方法可以使用 Rhino (vanilla javascript) 来解决它。您需要解析它或找到一个可以解析它的库。您可以在 Rhino https://groups.google.com/g/mozilla.dev.tech.js-engine.rhino/c/fS8KQelY0bs
中使用 JavaScript 库仅供参考 - Baleudung says Rhino is obsolete and Nashorn is faster.
原回复:
尝试使用 process = process.replaceAll("%","/100");
replaceAll 接受一个正则表达式,每次找到正则表达式时,它都会用替换值准确地替换它。在您的第一个示例中,它将更改为 5+3?/100*?+2
,这是无效的 javascript
/
的优先级高于 +
,因此它会在添加数字之前将值调整为百分比。
根据您希望计算器的工作方式,当使用多个 % 时可能会出现问题。例如,5+3%% 或 (1-3)+(1+2%)%。您需要决定是否希望 3%% 表示 3/100/100。如果你想拒绝 %%,你可以在输入阶段处理这个问题,通过不让 %% 进入或在输入阶段之后通过解析将 %% 变成 %。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。