| | |
| | | formula = formula.replace("(", "(") |
| | | .replace(")", ")") |
| | | .replace(",", ","); |
| | | //然后提取英文字母,全部转换为大写 |
| | | String[] strs = formula.split("[^A-Za-z]+"); |
| | | String upperStr = ""; |
| | | for (String str : strs) { |
| | | upperStr += str.toUpperCase(); |
| | | } |
| | | //然后提取公式 |
| | | String strs = formula.substring(0,formula.indexOf("(")); |
| | | String upperStr = strs.toUpperCase(); |
| | | if (upperStr.equals("")) { |
| | | throw new ErrorException(formula + "里面的公式没有函数"); |
| | | } |
| | | System.out.println(upperStr); |
| | | //然后获取最外面括号里面的值,再根据","分割 |
| | | int start = formula.indexOf("("); |
| | | int end = -1; |
| | |
| | | throw new ErrorException("公式括号不匹配: " + formula); |
| | | } |
| | | |
| | | String inner = formula.substring(start + 1, end); |
| | | String argumentsStr = formula.substring(start + 1, end); |
| | | List<String> arguments = new ArrayList<>(); |
| | | int depth = 0; |
| | | int bracketCount = 0; |
| | | StringBuilder currentArgument = new StringBuilder(); |
| | | for ( |
| | | char c : inner.toCharArray()) { |
| | | if (c == ',' && depth == 0) { |
| | | for (char c : argumentsStr.toCharArray()) { |
| | | if (c == ',' && bracketCount == 0) { |
| | | arguments.add(currentArgument.toString()); |
| | | currentArgument.setLength(0); |
| | | } else { |
| | | if (c == '(') { |
| | | depth++; |
| | | } else if (c == ')') { |
| | | depth--; |
| | | } |
| | | if (c == '(') bracketCount++; |
| | | if (c == ')') bracketCount--; |
| | | currentArgument.append(c); |
| | | } |
| | | } |
| | | arguments.add(currentArgument.toString()); |
| | | String[] bracketStrs = arguments.toArray(new String[0]); |
| | | |
| | | List<BigDecimal> results = new ArrayList<>(); |
| | | for ( |
| | | String expr : bracketStrs) { |
| | | for (String expr : bracketStrs) { |
| | | System.out.println("替换前" + expr); |
| | | Pattern pattern = Pattern.compile("\\b\\d+\\b"); |
| | | Pattern pattern = Pattern.compile("([A-Z])(\\d+)"); |
| | | Matcher matcher = pattern.matcher(expr); |
| | | StringBuffer sb = new StringBuffer(); |
| | | while (matcher.find()) { |
| | | int index = Integer.parseInt(matcher.group()) - 1; |
| | | String letter = matcher.group(1); |
| | | int index = Integer.parseInt(matcher.group(2)) - 1; // 将1-based转为0-based |
| | | if (index < bigDecimalList.size()) { |
| | | matcher.appendReplacement(sb, bigDecimalList.get(index).toString()); |
| | | } else { |
| | | throw new ErrorException("表达式中的下标 " + index + " 超出范围"); |
| | | throw new RuntimeException("公式中的下标 " + index + " 超出范围"); |
| | | } |
| | | } |
| | | matcher.appendTail(sb); |
| | | System.out.println("替换后" + sb.toString()); |
| | | //计算 |
| | | |
| | | // 计算表达式 |
| | | ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); |
| | | try { |
| | | Object result = engine.eval(sb.toString()); |
| | | results.add(new BigDecimal(result.toString())); |
| | | } catch (Exception e) { |
| | | throw new IllegalArgumentException("无法计算表达式: " + sb, e); |
| | | throw new IllegalArgumentException("无法计算公式: " + sb, e); |
| | | } |
| | | } |
| | | // 根据函数名称进行相应计算 |