如何用犀牛脚本处理百分比?

如何解决如何用犀牛脚本处理百分比?

我正在制作一个计算器应用程序,它基本上构建了一个使用 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?