这里我添加了小数点的控制,默认是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; } }
浙公网安备 33010602011771号