这里我添加了小数点的控制,默认是2位小数点。

 

package jqt;

import io.qt.core.QMetaType;
import io.qt.core.QRegularExpression;
import io.qt.core.QVariant;
import io.qt.core.Qt;
import io.qt.widgets.QTableWidgetItem;
import manifold.ext.rt.api.Jailbreak;

public class QCell extends QTableWidgetItem{
    volatile boolean cacheIsDirty;
    volatile QVariant cachedValue;
    final String fmt = "%.2f";
    final QVariant Invalid = new QVariant();

    public QCell() {
        super();
        setDirty();
    }

    public QTableWidgetItem clone() {
        return new QCell();
    }

    public void setData(int role, Object value) {
        super.setData(role, value);
        if (role == Qt.ItemDataRole.EditRole)
            setDirty();
    }

    public Object data(int role) {
        QVariant value = value();
        if (role == Qt.ItemDataRole.DisplayRole) {
            if (value.isValid()) {
                return value.toString();
            } else {
                return "####";
            }
        } else if (role == Qt.ItemDataRole.TextAlignmentRole) {
            if (value.isType(QMetaType.Type.QString)) {
                return new Qt.Alignment(Qt.AlignmentFlag.AlignLeft, Qt.AlignmentFlag.AlignVCenter).toInt();
            } else {
                return new Qt.Alignment(Qt.AlignmentFlag.AlignRight, Qt.AlignmentFlag.AlignVCenter).toInt();
            }
        } else
            return super.data(role);
    }

    public void setFormula(String formula) {
        setData(Qt.ItemDataRole.EditRole, formula);
    }

    public String formula() {
        Object data = data(Qt.ItemDataRole.EditRole);
        return data == null ? "" : data.toString();
    }

    public void setDirty() {
        cacheIsDirty = true;
    }

    public QVariant value() {
        if (cacheIsDirty) {
            cacheIsDirty = false;

            String formulaStr = formula();
            if (formulaStr.startsWith('\'')) {
                cachedValue = formulaStr.substring(1).toVariant();
            } else if (formulaStr.startsWith('=')) {
                cachedValue = Invalid;
                String expr = formulaStr.substring(1).replace(" ","") + '\0';
                Integer pos = new Integer(0);//Integer pos = 0; 类似static Integer pos = 0; @Jailbreak描述形参
                cachedValue = evalExpression(expr, pos);
                if (expr[pos] != '\0')
                    cachedValue = Invalid;
            } else {
                try{
                    cachedValue = formulaStr.toDouble().toVariant();
                } catch(NumberFormatException | NullPointerException e){
                    cachedValue = formulaStr.toVariant();
                }
            }
        }
        return cachedValue;
    }

    public QVariant evalExpression(String str, @Jailbreak Integer pos) {
        QVariant result = evalTerm(str, pos);
        while (str[pos] != '\0') {
            char op = str[pos];
            if (op != '+' && op != '-')
                return result;
            pos.value = pos.value + 1;

            QVariant term = evalTerm(str, pos);
            if (result.isType(QMetaType.Type.Double) && term.isType(QMetaType.Type.Double)) {
                if (op == '+') {
                    result = fmt.arg(result.toDouble() + term.toDouble()).toDouble().toVariant();
                } else {
                    result = fmt.arg(result.toDouble() - term.toDouble()).toDouble().toVariant();
                }
            } else {
                result = Invalid;
            }
        }
        return result;
    }

    public QVariant evalTerm(String str, @Jailbreak Integer pos) {
        QVariant result = evalFactor(str, pos);
        while (str[pos] != '\0') {
            char op = str[pos];
            if (op != '*' && op != '/')
                return result;
            pos.value = pos.value + 1;

            QVariant factor = evalFactor(str, pos);
            if (result.isType(QMetaType.Type.Double) && factor.isType(QMetaType.Type.Double)) {
                if (op == '*') {
                    result = fmt.arg(result.toDouble() * factor.toDouble()).toDouble().toVariant();
                } else {
                    if (factor.toDouble() == 0.0) {
                        result = Invalid;
                    } else {
                        result = fmt.arg(result.toDouble() / factor.toDouble()).toDouble().toVariant();
                    }
                }
            } else {
                result = Invalid;
            }
        }
        return result;
    }

    public QVariant evalFactor(String str, @Jailbreak Integer pos) {
        QVariant result;
        boolean negative = false;

        if (str[pos] == '-') {
            negative = true;
            pos.value = pos.value + 1;
        }

        if (str[pos] == '(') {
            pos.value = pos.value + 1;
            result = evalExpression(str, pos);
            if (str[pos] != ')')
                result = Invalid;
            pos.value = pos.value + 1;
        } else {
            QRegularExpression regExp = new QRegularExpression("[A-Za-z][1-9][0-9]{0,2}");
            String token = "";

            while (((Character)str[pos]).isLetterOrDigit() || str[pos] == '.') {
                token += str[pos];
                pos.value = pos.value + 1;
            }
            if (regExp.match(token).hasMatch()) {
                int column = ((Character)token[0]).toUpperCase() - 'A';
                int row = token.substring(1).toInt() - 1;

                QCell c = (QCell) tableWidget().item(row, column);
                if (c != null) {
                    result = c.value();
                } else {
                    result = Invalid;
                }
            } else {
                try{
                    result = token.toDouble().toVariant();
                }
                catch(NumberFormatException | NullPointerException e){
                    result = Invalid;
                }
            }
        }

        if (negative) {
            if (result.isType(QMetaType.Type.Double)) {
                result = ((Double)(-result.toDouble())).toVariant();
            } else {
                result = Invalid;
            }
        }
        return result;
    }

}

 

posted on 2025-04-03 12:51  dalgleish  阅读(25)  评论(0)    收藏  举报