找回密码
 立即注册

QQ登录

只需一步,快速开始

清酒℡

注册会员

16

主题

65

帖子

191

积分

注册会员

积分
191
清酒℡
注册会员   /  发表于:2023-4-26 18:16  /   查看:2431  /  回复:10
30金币


image.png379316405.png 如图使用spread的parse方法实现功能:当单元格值被切换为万元时,输入的值应也为万元单位时(此时输入1 切换为元时会显示10000)

遇到这样一个问题:单元为元时  单元格值为1的时候  我切换成万元后 这个1变为0  没错,但是当我再次输入1时  他还是自动变为0了  输入不等于1的值 则正常显示输入的值
image.png721532287.png

最佳答案

查看完整内容

你的意思是对于一个数字,需要两种自定义格式 1:万元(同时支持设置千分位,小数位) 2:元(同时支持设置千分位,小数位) 第二种的话,实际上就设置普通格式即可。比如设置格式字符串为“#,##0.00元”就是带千分位,精确到分的格式 第一种的话,你需要自定义格式,但是也可以传入一个格式字符串,来对千分位,小数位这部分做格式化,自己仅处理把一个浮点数除10000即可,这样在保留小数位和其他的自定义格式方面是自由 ...

10 个回复

倒序浏览
最佳答案
最佳答案
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-4-26 18:16:40
来自 7#
你的意思是对于一个数字,需要两种自定义格式
1:万元(同时支持设置千分位,小数位)
2:元(同时支持设置千分位,小数位)

第二种的话,实际上就设置普通格式即可。比如设置格式字符串为“#,##0.00元”就是带千分位,精确到分的格式

第一种的话,你需要自定义格式,但是也可以传入一个格式字符串,来对千分位,小数位这部分做格式化,自己仅处理把一个浮点数除10000即可,这样在保留小数位和其他的自定义格式方面是自由的。

自定义万元格式
  1. function CustomNumberFormat(formatstr) {
  2.     this.formatstr=formatstr;
  3. }

  4. CustomNumberFormat.prototype = new GC.Spread.Formatter.FormatterBase();

  5. CustomNumberFormat.prototype.format = function (obj, formattedData) {
  6.     if (typeof obj === "number") {
  7.         return formatNumber(obj, formattedData,this.formatstr);
  8.     } else if (typeof obj === "string") {
  9.         
  10.         if (Number.isFinite(+obj)) {
  11.             return formatNumber(parseFloat(obj), formattedData,this.formatstr);
  12.         }
  13.     }
  14.     return obj ? obj.toString() : "";
  15. };
  16. function formatNumber(value, formattedData,formatstr) {

  17.     var generalformatter=new GC.Spread.Formatter.GeneralFormatter();
  18.     generalformatter.formatString(formatstr);
  19.     //在这里处理.给值除以10000,然后仍然应用传入的格式字符串做格式化
  20.     console.log(value/10000);
  21.     return generalformatter.format(value/10000, formattedData);

  22. }
  23. CustomNumberFormat.prototype.parse = function (str) {
  24.     var generalformatter=new GC.Spread.Formatter.GeneralFormatter();
  25.     generalformatter.formatString(this.formatstr);
  26.     console.log(generalformatter.parse(str))
  27.     return generalformatter.parse(str);
  28. };
复制代码


给一个单元格应用万元格式
  1. sheet.getRange(0, 0, 6, 2).formatter(new CustomNumberFormat("#,##0.0000万"));
复制代码


效果
image.png662980651.png
回复 使用道具 举报
MillionDream
注册会员   /  发表于:2023-4-27 09:52:59
2#
只看你的描述很难说是什么问题,能发一个可以复现的Demo吗?
回复 使用道具 举报
清酒℡
注册会员   /  发表于:2023-4-27 12:46:08
3#
MillionDream 发表于 2023-4-27 09:52
只看你的描述很难说是什么问题,能发一个可以复现的Demo吗?

点击 元单位  输入1  再切换万元单位  再在刚才的单元格输入同样的数  会自动变为0  在别的格子输入1  就是显示1  切换为元变为10000

demo.rar

6.23 MB, 下载次数: 343

回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-4-27 19:56:06
4#
“但是当我再次输入1时  他还是自动变为0了  输入不等于1的值 则正常显示输入的值”

这个目前是正常的,因为你本身的值就是1,那么你再次输入1的时候,由于值没有变,所以实际上并未触发parse方法。你可以给你的两个parse方法中打上console.log就能发现

看到你这边的自定义格式整体逻辑比较复杂,你可以详细描述一下需求。我们来帮忙看看具体怎么做方便
回复 使用道具 举报
清酒℡
注册会员   /  发表于:2023-4-27 20:13:17
6#
Richard.Ma 发表于 2023-4-27 19:56
“但是当我再次输入1时  他还是自动变为0了  输入不等于1的值 则正常显示输入的值”

这个目前是正常的, ...

项目中,有千分位,小数位,单位的切换(元/万元) 这三个功能,希望它们们能够互相联动。初始化的时候也会有这三个参数,需要根据具体的参数设置单元格格式
回复 使用道具 举报
清酒℡
注册会员   /  发表于:2023-4-28 11:53:41
8#
Richard.Ma 发表于 2023-4-28 11:41
你的意思是对于一个数字,需要两种自定义格式
1:万元(同时支持设置千分位,小数位)
2:元(同时支持设 ...

好的,我下午试一下,谢谢~~
回复 使用道具 举报
清酒℡
注册会员   /  发表于:2023-4-28 13:35:57
9#
Richard.Ma 发表于 2023-4-28 11:41
你的意思是对于一个数字,需要两种自定义格式
1:万元(同时支持设置千分位,小数位)
2:元(同时支持设 ...

你好,使用了这个方法确实能够优化了很多代码,但是之前的问题好像还是没有解决,就是期望无论是在万元还是在元的格式上,用户输入什么就会显示什么,比如输入万元格式下输入1(及时和之前的一样的),也要显示为1,切换成元后要换成10000
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-4-28 18:13:38
10#
“用户输入什么就会显示什么”这里逻辑实际上有问题,比如在我发你的代码中在自定义格式化为万元的时候,输入1就显示1万是不合理的。输入1显示0.0001万才合理,参考上面的截图两列对比

格式化只控制显示的值,而不应该控制或改变输入的值。也就是说即使你设置的格式化,是要把一个数字格式化成万元显示,那么也应该是在实际值的基础上除以10000。


如果按照你的期望“无论是在万元还是在元的格式上,用户输入什么就会显示什么”,那么在万元时,用户输入1,你首先得先把改为10000(可能是通过valueChanged,或者editEnded等事件,直接改单元格),然后才是在这个值的基础上应用自定义格式化,让他又变回1.
回复 使用道具 举报
清酒℡
注册会员   /  发表于:2023-5-9 11:01:20
11#
Richard.Ma 发表于 2023-4-28 18:13
“用户输入什么就会显示什么”这里逻辑实际上有问题,比如在我发你的代码中在自定义格式化为万元的时候,输 ...


                let oldChaned = GC.Spread.Sheets.CellTypes.Text.prototype.isEditingValueChanged;
                 GC.Spread.Sheets.CellTypes.Text.prototype.isEditingValueChanged = function(oldValue, newValue, context){
                    console.log('1',oldValue, newValue)
                    var sheet = context.sheet,
                    row = context.row,
                    col = context.col,
                    sheetArea = context.sheetArea || GC.Spread.Sheets.SheetArea.viewport;
                    var style = sheet.getStyle(row, col, sheetArea);
                    if(style) {
                        console.log(1,style)
                    }
                    if(style && style.formatter instanceof CustomNumberFormat){
                        if(oldValue === newValue) {
                            return false
                        }
                    }
                return oldChaned.apply(this,arguments);
                }
重写了这个方法,那个直接输入相同的值的问题解决了,出现了新的问题,万元单位下,双击一个有值的单元格,如果没有进行更改,它会直接*10000,期望它不的值不
变,只有用户更改了后才变


回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部