找回密码
 立即注册

QQ登录

只需一步,快速开始

a793126490

注册会员

10

主题

20

帖子

72

积分

注册会员

积分
72
a793126490
注册会员   /  发表于:2020-5-13 16:24  /   查看:4945  /  回复:9
1金币
我想自定义一个数据验证规则,限制只能输入数字且最多输入四位小数,我查看了教程中的基于数字的数据验证器,我自己能够配置出来限制输入数字,但是无法限制最多输入四位小数,请问下应该如何创建这个数据验证

最佳答案

查看完整内容

用正则实现了一个自定义函数,给单元格添加这个自定义的公式验证器,请查看附件:

9 个回复

倒序浏览
最佳答案
最佳答案
Fiooona
论坛元老   /  发表于:2020-5-13 16:24:18
来自 2#
本帖最后由 Fiooona 于 2020-5-23 22:38 编辑

用正则实现了一个自定义函数,给单元格添加这个自定义的公式验证器,请查看附件: image.png715006408.png
  1.    function RegExFunction() {
  2.             this.name = "REGEX";
  3.             this.maxArgs = 2;
  4.             this.minArgs = 2;
  5.             this.typeName = "RegExFunction";
  6.         }
  7.         RegExFunction.prototype = new GC.Spread.CalcEngine.Functions.Function();
  8.         RegExFunction.prototype.isContextSensitive = function () {
  9.             return true;
  10.         }
  11.         RegExFunction.prototype.evaluate = function () {
  12.             debugger
  13.             var context = arguments[0], value = context.source.getValue(context.row, context.column);
  14.             var reg = new RegExp(arguments[1]);
  15.             if (value) {
  16.                 return reg.test(value.toString());
  17.             }
  18.             return false;
  19.         }
  20.   sheet.addCustomFunction(new RegExFunction());
  21.             sheet.setValue(19, 0, "自定义公式数据验证");
  22.             sheet.setValue(19, 1, "最多四位小数的数字");
  23. 1
  24.             var dv8 = GC.Spread.Sheets.DataValidation.createFormulaValidator('REGEX("^([1-9]\\d{0,15}|0)(\\.\\d{1,4})?$")');
复制代码


features_cells_data-validation_basic-data-validator_JavaScript.zip

3.39 KB, 下载次数: 417

组件化表格编辑器(预览版)试用进行中,点击了解详情!
请点击评分,对我的服务做出评价!5分为非常满意!
回复 使用道具 举报
汇新泓博
初级会员   /  发表于:2022-10-26 17:13:15
3#
Fiooona 发表于 2020-5-13 16:24
用正则实现了一个自定义函数,给单元格添加这个自定义的公式验证器,请查看附件:

验证四位小数的   输入0会报错
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2022-10-26 18:03:57
4#
汇新泓博 发表于 2022-10-26 17:13
验证四位小数的   输入0会报错

这边经过验证,是因为在RegExFunction中,对value做了判断,返回了false
image.png94866637.png

所以您这边可以修改 构造函数,对0做下特殊处理。
回复 使用道具 举报
小弟弟
初级会员   /  发表于:2022-11-4 15:17:41
5#
麻烦想问一下 如果在继续设置他的最小值和最大值呢 要怎么加
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2022-11-4 15:21:02
6#
小弟弟 发表于 2022-11-4 15:17
麻烦想问一下 如果在继续设置他的最小值和最大值呢 要怎么加

您可以在上述代码的RegExFunction.prototype.evaluate 方法 ,判断符合正则表达式后,再判断是否处于最大值最小值之间,然后返回true|false。
回复 使用道具 举报
小弟弟
初级会员   /  发表于:2022-11-4 16:57:03
7#
那怎么才能传进去我想设置的最大值最小值的参数啊
回复 使用道具 举报
小弟弟
初级会员   /  发表于:2022-11-4 17:04:21
8#
Ellia.Duan 发表于 2022-11-4 16:58
数据验证一般是提前预设好条件,根据单元格内容来进行验证。这里不太明白您的需求?

就是我要设置这个单元格的最小值和最大值,同时还要能限制他小位数的位数,您上面说的判断完正则后继续判断,我想知道怎么从
RegExFunction.prototype.evaluate = function () {
  // debugger;
  var context = arguments[0],
    value = context.source.getValue(context.row, context.column);
  var reg = new RegExp(arguments[1]);
  if (value) {
    console.log(value,reg,'')
    return reg.test(value.toString());
  }
  return false;
};
这里获取到他的最大值最小值进行判断

我下面的方法是
var dv8 = GC.Spread.Sheets.DataValidation.createFormulaValidator(
          'REGEX("^([0-9]$|^[1][0-9]$|^[2][0-9]$|^[3][0-9])(\\.\\d{1,3})?$")'
          );
这样传的
回复 使用道具 举报
小弟弟
初级会员   /  发表于:2022-11-4 17:31:23
9#
Ellia.Duan 发表于 2022-11-4 15:21
您可以在上述代码的RegExFunction.prototype.evaluate 方法 ,判断符合正则表达式后,再判断是否处于最大 ...

没法发送电话
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2022-11-4 17:37:40
10#
本帖最后由 Ellia.Duan 于 2022-11-4 17:38 编辑

您好,createFormulaValidator 方法只能传入一个参数,即公式formula,在公式的执行方法中,接收此公式值,所以createFormulaValidator 暂时不能传您的最大最小值。
建议您在此贴中继续回复
https://gcdn.grapecity.com.cn/forum.php?mod=viewthread&tid=156745
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部