找回密码
 立即注册

QQ登录

只需一步,快速开始

HEXIONLY

注册会员

7

主题

20

帖子

55

积分

注册会员

积分
55
HEXIONLY
注册会员   /  发表于:2022-9-20 11:56  /   查看:1149  /  回复:7
1金币
自定义格式,点击切换后,鼠标在sheet上移动,依旧加载

image.png217619628.png

demo如下:
  1. import GC from "@grapecity/spread-sheets";

  2. // 切换的格式
  3. const NUMBER_FORMATTER_TYPE = [1, 1, 10, 100, 1000, 10000, 100000000];
  4. window.INIT_UNIT = 0;

  5. /**
  6. * 自定义数据格式
  7. * @param formattedData 格式级别
  8. * @constructor
  9. */
  10. export function NumberFormat(formattedData) {
  11.     this.formattedData = formattedData;
  12. }

  13. // 自定义数值格式化(元,百元,千元,万元,亿元,转换)
  14. NumberFormat.prototype = new GC.Spread.Formatter.FormatterBase();
  15. // NumberFormat.prototype = new GC.Spread.Formatter.GeneralFormatter();
  16. NumberFormat.prototype.format = function (obj) {
  17.     return numberFormatter(obj, this.formattedData);
  18. }

  19. /**
  20. * 格式化操作业务代码
  21. * @param number 格式化数值
  22. * @param formattedData 格式化类别
  23. * @returns {string} 转换后数值
  24. */
  25. function numberFormatter(number, formattedData) {
  26.     let num = number;
  27.     if (typeof(number) == 'number' && !isNaN(Number(number))) {
  28.         // 转换时以原始单位转换
  29.         let multiple = NUMBER_FORMATTER_TYPE[formattedData] / NUMBER_FORMATTER_TYPE[window.INIT_UNIT];
  30.         console.log(number, multiple)
  31.         switch (formattedData) {
  32.             case 0:
  33.             case 1:
  34.                 num = (number / multiple).toFixed(2);
  35.                 break;
  36.             case 2:
  37.                 num = (number / multiple).toFixed(2);
  38.                 break;
  39.             case 3:
  40.                 num = (number / multiple).toFixed(2);
  41.                 break;
  42.             case 4:
  43.                 num = (number / multiple).toFixed(2);
  44.                 break;
  45.             case 5:
  46.                 num = (number / multiple).toFixed(2);
  47.                 break;
  48.             case 6:
  49.                 num = (number / multiple).toFixed(2);
  50.                 break;
  51.             default:
  52.                 num = number;
  53.         }
  54.         return num.replace(/(\d)(?=(\d{3})+\.)/g, '$1,');
  55.     }
  56.     return num;
  57. }

复制代码


最佳答案

查看完整内容

这个本身机制就是如此NumberFormat.prototype.format方法会在上述情况被调用。

7 个回复

倒序浏览
最佳答案
最佳答案
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-9-20 11:56:10
来自 6#
这个本身机制就是如此NumberFormat.prototype.format方法会在上述情况被调用。
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-9-20 17:50:10
2#
完整的demo提供一下,最好是能直接重现问题的
回复 使用道具 举报
HEXIONLY
注册会员   /  发表于:2022-9-20 18:00:52
3#
Clark.Pan 发表于 2022-9-20 17:50
完整的demo提供一下,最好是能直接重现问题的

上述代码就是完整的:
点击切换格式方法:
changeUnit(event) {
                let sheet = this.spread.getActiveSheet();
// event:要切换的格式,这里选择0,1,2,3,4,5,6;
                sheet.getRange(0, 0, 1445, 2).formatter(new NumberFormat(event))
            },
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-9-20 18:10:30
4#
看你发的这个方法,你点击切换也切换的是这个自定义格式啊,那么自定义格式对应的方法运行有什么问题呢?
回复 使用道具 举报
HEXIONLY
注册会员   /  发表于:2022-9-20 18:28:06
5#
运行可以正常切换,但是之后鼠标在sheet上边移动或者点击cell它就还会继续运行,我在上边34行有个打印,可以看到
回复 使用道具 举报
HEXIONLY
注册会员   /  发表于:2022-9-21 12:20:51
7#
Clark.Pan 发表于 2022-9-21 11:13
这个本身机制就是如此NumberFormat.prototype.format方法会在上述情况被调用。

这种啊,我还以为是因为我写的原因
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-9-21 18:51:14
8#
那就结贴了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部