找回密码
 立即注册

QQ登录

只需一步,快速开始

wangqgsunway

中级会员

84

主题

224

帖子

740

积分

中级会员

积分
740
wangqgsunway
中级会员   /  发表于:2018-7-18 14:42  /   查看:2422  /  回复:4
        FdaFunction.prototype = new GC.Spread.CalcEngine.Functions.AsyncFunction(
                        "FDA", 1, 2, {
                                description : "对value进行四舍六入五留双修约,保留小数点后指定位数",
                                parameters : [ {
                                        name : "value",
                                        repeatable : false,
                                        optional : false
                                }, {
                                        name : "places",
                                        repeatable : false,
                                        optional : false
                                } ]
                        });
        FdaFunction.prototype.evaluate = function(context, value, places) {
                var num;
                if (!isNaN(parseInt(value)) && !isNaN(parseInt(places))) {
                        var viewport = designer.wrapper.spread.getActiveSheet().getFormatter(context.row,context.col,GC.Spread.Sheets.SheetArea.viewport);
                        if(isEmpty(viewport)){
                                designer.wrapper.spread.getActiveSheet().setFormatter(context.row,context.col,"@",GC.Spread.Sheets.SheetArea.viewport);
                        }
                        if (value < 0) {
                                num = -value;
                        } else {
                                num = value;
                        }

                        if(places<0)
                                return value;
                        var v=Number(value);
                        var s=v+"";
                        var result="";
                        if(s.indexOf(".")!=-1){
                                var s_1=s.substring(s.indexOf(".")+1);
                                if(s_1.length==parseInt(places)+1){
                                        if(s_1.endsWith("5")){
                                                var s_2=s.substr(0,s.length-1);
                                                var n=Number(s_2);
                                                var s_n=n.toFixed(places);
                                                var x=s_n.substring(s_n.length-1);
                                                if(Number(x)%2==0){
                                                        result=s_n;
                                                }
                                        }
                                }
                        }
                        if(result==""){
                                result=v.toFixed(places);
                        }
                       
                        if(value < 0&& value!='0'){
                                result = "-"+result;
                        }
                       
                        return result;
                }else{
                        return "#VALUE!";
                }
        }

不计算.gif

4 个回复

倒序浏览
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2018-7-18 17:46:14
沙发
我这边正在处理,预计明天给您一个回复。
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2018-7-19 15:32:54
板凳
将原来代码改为这个试一下
  1. var FdaFunction = function () {
  2.         this.name = "FDA";
  3.         this.minArgs = 1;
  4.         this.maxArgs = 2;
  5.        

  6. };
  7. FdaFunction.prototype = new GC.Spread.CalcEngine.Functions.Function();
  8. FdaFunction.prototype.description = function () {
  9.         return {
  10.                 description: "对value进行四舍六入五留双修约,保留小数点后指定位数",
  11.                 parameters : [ {
  12.                         name : "value",
  13.                         repeatable : false,
  14.                         optional : false
  15.                 }, {
  16.                         name : "places",
  17.                         repeatable : false,
  18.                         optional : false
  19.                 }]
  20.         }
  21. }
  22. FdaFunction.prototype.isContextSensitive = function () {
  23.         return true;
  24. }
  25. FdaFunction.prototype.evaluate = function(context, value, places) {
  26.         var context = arguments[0];
  27.         var num;
  28.         if (!isNaN(parseInt(value)) && !isNaN(parseInt(places))) {
  29.                         var viewport = spread.getActiveSheet().getFormatter(context.row,context.column,GC.Spread.Sheets.SheetArea.viewport);
  30.                         if(isEmpty(viewport)){
  31.                                         spread.getActiveSheet().setFormatter(context.row,context.column,"@",GC.Spread.Sheets.SheetArea.viewport);
  32.                         }
  33.                         if (value < 0) {
  34.                                         num = -value;
  35.                         } else {
  36.                                         num = value;
  37.                         }

  38.                         if(places<0)
  39.                                         return value;
  40.                         var v=Number(value);
  41.                         var s=v+"";
  42.                         var result="";
  43.                         if(s.indexOf(".")!=-1){
  44.                                         var s_1=s.substring(s.indexOf(".")+1);
  45.                                         if(s_1.length==parseInt(places)+1){
  46.                                                         if(s_1.endsWith("5")){
  47.                                                                         var s_2=s.substr(0,s.length-1);
  48.                                                                         var n=Number(s_2);
  49.                                                                         var s_n=n.toFixed(places);
  50.                                                                         var x=s_n.substring(s_n.length-1);
  51.                                                                         if(Number(x)%2==0){
  52.                                                                                         result=s_n;
  53.                                                                         }
  54.                                                         }
  55.                                         }
  56.                         }
  57.                         if(result==""){
  58.                                         result=v.toFixed(places);
  59.                         }
  60.                        
  61.                         if(value < 0&& value!='0'){
  62.                                         result = "-"+result;
  63.                         }
  64.                        
  65.                         return result;
  66.         }else{
  67.                         return "#VALUE!";
  68.         }
  69. }
复制代码
回复 使用道具 举报
wangqgsunway
中级会员   /  发表于:2018-7-19 16:23:24
地板
测试了一下  阔以,灰常感谢  辛苦啦      

FdaFunction.prototype.isContextSensitive = function () {
        return true;
}         
FdaFunction.prototype.evaluate = function(context, value, places) {                           
var context = arguments[0];


我其他自定义公式需要改这三处代码么?
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2018-7-19 17:59:42
5#
是的,用正常的自定义函数来计算,不需要用异步函数,您这边试一下,改了后还有没有问题,我这边测试公式都可以正常运行
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部