CountUtils.java 2.91 KB
Newer Older
刘_震's avatar
刘_震 committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
package com.ruoyi.system.utils;

import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;

/**
 * @author haiwe
 * @date 2024/6/18
 */
public class CountUtils {
    private static final List<Character> FH = Arrays.asList('+', '-', '*', '/');

    public static String count(String value) {
        value = value.replaceAll(" ", "");
        value = value.replaceAll(",", "");
        char sta = value.charAt(0);
        char end = value.charAt(value.length() - 1);
        if (value.charAt(0) == '-' && value.charAt(1) == '-'){
            value = value.substring(2);
        }
        if ((sta < 48 || sta > 57) && sta != '-') {
            return "公式填写有误";
        }
        if (end < 48 || end > 57) {
            return "公式填写有误";
        }
        return CountUtils.count1(value);
    }

    public static String count1(String value) {
        Pattern pattern = Pattern.compile("^-?\\d+(\\.\\d+)?$");
        if (pattern.matcher(value).matches()) {
            return value;
        }
        // 判断是否为 x + y
        boolean ifAccordOne = true;
        // 判断是否为 x + y + z + ...
        boolean ifAccordTwo = true;
        // 记录第一个符合位置
        int accordPositionOne = -1;
        // 记录第二个符合位置
        int accordPositionTwo = value.length();
        for (int i = 0; i < value.length(); i++) {
            char charAt = value.charAt(i);
            if (FH.contains(charAt) && !ifAccordOne) {
                ifAccordTwo = false;
                accordPositionTwo = i;
                break;
            } else if (FH.contains(charAt)) {
                if (i == 0 && value.charAt(i) == '-') continue;
                ifAccordOne = false;
                accordPositionOne = i;
                if (value.charAt(i + 1) == '-'){
                    i++;
                }
            }
        }
        String sta = value.substring(0, accordPositionOne);
        String end = value.substring(accordPositionOne + 1, accordPositionTwo);
        char charAt = value.substring(accordPositionOne, accordPositionOne + 1).charAt(0);
        String jg = "";
        if (charAt == 42) {
            //*
            jg = new BigDecimal(sta).multiply(new BigDecimal(end)).toString();
        } else if (charAt == 43) {
            // +

            jg = new BigDecimal(sta).add(new BigDecimal(end)).toString();
        } else if (charAt == 45) {
            // -
            jg = new BigDecimal(sta).subtract(new BigDecimal(end)).toString();
        } else if (charAt == 47) {
            // /
            jg = new BigDecimal(sta).divide(new BigDecimal(end)).toString();
        }
        if (ifAccordTwo) {
            return jg;
        } else {
            String s = StringUtils.replaceOnce(value, value.substring(0, accordPositionTwo), jg);
            value = count1(s);
        }
        return value;
    }
}