我详细查看了您提供的demo,我们的格式提示功能确实无法完全满足您的需求,对于您目前所描述的复杂需求来看我们没有一个现成的API可以直接满足您的需求.
如果您确实对这个有所需要,那么您需要自己来进行自定义设计,以下是一个您可以参考的是实现方式:
1. 您通过监听用户键入公式的操作
2. 动态的为用户操作的单元格去设置保留几位小数
以下是一个示例,你可以在这个示例基础上进行拓展,覆盖到您所需要的所有场景
- sheet.bind(GC.Spread.Sheets.Events.UserFormulaEntered, function (e, info) {
- var row = info.row;
- var col = info.col;
- var formula = info.formula;
- var sheet = info.sheet;
- var precedentCells = sheet.getPrecedents(0, 2)
- evaluate(formula)
- // 1. 解析公式字符串
- const pattern = /(SUM|SUBTRACT|MULTIPLY|DIVIDE)\(([^)]+)\)/i;
- const match = formula.match(pattern);
- var n = 0;
- // 2. 根据不同公式设置不同的格式
- if (match) {
- switch (match[1].toUpperCase()) {
- case 'SUM':
- // 加法,以小数位最多的那个为准
- precedentCells.forEach(cellRange => {
- for (var i = cellRange.row; i < cellRange.rowCount; i++) {
- for (var j = cellRange.col; j < cellRange.colCount; j++) {
- n = Math.max(n, getDecimalLength(sheet.getText(i, j)))
- }
- }
- });
- case 'SUBTRACT':
- // 减法,以小数位最多的那个为准, 同上
- case 'MULTIPLY':
- // 乘法,以小数位和为结果的小数位
- precedentCells.forEach(cellRange => {
- for (var i = cellRange.row; i < cellRange.rowCount; i++) {
- for (var j = cellRange.col; j < cellRange.colCount; j++) {
- n = getDecimalLength(sheet.getText(i, j)) + n;
- }
- }
- });
- case 'DIVIDE':
- // 除法,以小数位和为结果的小数位
- return 'Division (/)';
- default:
- return 'Unknown operation';
- }
- }
- sheet.setFormatter(row, col, generateZeros(n))
- });
- function generateZeros(n) {
- // 检查n是否为正整数
- if (!Number.isInteger(n) || n <= 0) {
- return "0"
- }
- let result = '0.'; // 开始拼接字符串
- // n-1次,循环添加零
- for (let i = 1; i < n; i++) {
- result += '0';
- }
- return result;
- }
- function getDecimalLength(num) {
- if (!Number.isFinite(num)) return 0; // 对非有限数返回0
- let e = 1, p = 0;
- while (Math.round(num * e) / e !== num) { e *= 10; p++; }
- return p;
- }
复制代码API:
|