设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 364|回复: 8
打印 上一主题 下一主题

[讨论] 数字位数多转为单位(ai生成的脚本)

[复制链接]

Lv4.逐梦者

梦石
0
星屑
14405
在线时间
2129 小时
注册时间
2016-9-20
帖子
856
跳转到指定楼层
1
发表于 2024-8-13 22:28:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 ppspssss 于 2024-9-1 09:44 编辑

以下仅作参考用途,脚本由AI篇写,未經详细测试
游戏的有时数字过大,有的游戏数值很高金钱很大 ,就想简略化看到多少 显示出数字比较直观不会太长,缺点是会较小的数字会省略不显示,例如,有游戏分几种币,银币铜币金币,比如100个铜币等于1个银币 , 可再细分100个银币等于1个金币之类,
例如如此图,图出自 萌新小百科之游戏代币   不真道长 剑网3攻略作者 不过此贴就不是还原这个,请修改自行转换
如此图


用法format_number_with_unit(填数字)


百度AIhttps://chat.baidu.com/
怎么ruby转换较大的数值给予一个单位,例如1000000 = 1百万 , 10000000 = 100百万

第一个版本


我之后发现原来通常都是外国游戏用k(千)Thousand,m(百万)Million ,b(十亿)Billion,t(兆/万亿)Trillion,
用中文的话若改成万,亿和万亿 就好多了

万,亿和万亿版本

#########



我发的贴子大多未经整理是草稿抱歉

Lv5.捕梦者

梦石
0
星屑
25577
在线时间
5285 小时
注册时间
2016-3-8
帖子
1650
2
发表于 2024-8-14 00:38:57 | 只看该作者
p format_number_with_unit(1234567)输出了1百万哦

点评

但脚本第36行楼主写的是# 输出: 123万#b  发表于 2024-8-14 10:20
这个好像是符合要求的,楼主要的就是省略次级单位只保留最大单位  发表于 2024-8-14 02:34
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2796
在线时间
174 小时
注册时间
2020-8-9
帖子
116
3
发表于 2024-8-14 02:32:39 | 只看该作者
超过万亿会出错是因为数据溢出了吧,没准输入30亿也会报错
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14405
在线时间
2129 小时
注册时间
2016-9-20
帖子
856
4
 楼主| 发表于 2024-8-14 10:28:45 | 只看该作者
本帖最后由 ppspssss 于 2024-8-14 15:07 编辑
alexncf125 发表于 2024-8-14 00:38
p format_number_with_unit(1234567)输出了1百万哦


回2楼:谢谢,已改正,輸出:1百万
回3楼:应该会支持更长的数字?我是问AI才知道Ruby好像能够输入任意长度的整数和计算, 随机数rand也能任意长度, 不过srand随机种子不能超过4字节最大值限制
问AI: 怎么用ruby加大位数,本来4字节太小,如何扩大位数
我发的贴子大多未经整理是草稿抱歉
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2796
在线时间
174 小时
注册时间
2020-8-9
帖子
116
5
发表于 2024-8-28 17:07:10 | 只看该作者
ppspssss 发表于 2024-8-14 10:28
回2楼:谢谢,已改正,輸出:1百万
回3楼:应该会支持更长的数字?我是问AI才知道Ruby好像能够输入任意长 ...

直接计算也许是支持的,但是你贴出来的函数应该是有设计到强转,数据类型转换这种,可能会有所限制,ruby的数据类型确实不严格,基本会自适应
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
36114
在线时间
10701 小时
注册时间
2009-3-15
帖子
4806
6
发表于 2024-8-28 17:48:51 | 只看该作者
是在取整时有上限?
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
23104
在线时间
2386 小时
注册时间
2005-10-15
帖子
1166

开拓者

7
发表于 2024-9-1 02:11:20 | 只看该作者
本帖最后由 SailCat 于 2024-9-1 02:21 编辑

不建议使用除以1000.0, 10000.0这样的操作
原因是1000.0这个数字没办法精确保存,简单的办法是to_s后,直接切字符串
随手写了一个,没仔细测
RUBY 代码复制
  1. # 用英文表示(千进制)配置第一行,中文表示(万进制)配置第二行
  2. EXP_WORDS = ["", "K", "M", "G", "T", "P", "E", "Z", "Y", "R", "Q"]
  3. # EXP_WORDS = ["", "万", "亿", "兆", "京", "垓", "秭", "穰", "沟", "涧"]
  4.  
  5. # 用英文表示(千进制)配置第一行,中文表示(万进制)配置第二行
  6. EXP_SIZE = 3
  7. # EXP_SIZE = 4
  8.  
  9. # 最小位数,不到此位数会降级显示(如设为2,23000会显示为23000而不是2万)
  10. MIN_DIGITS = 1
  11.  
  12. # 小数点后有效数字(12.0的0有意义,转换会保留)
  13. DECIMALS = 0
  14.  
  15.  
  16. #--------------------------------------------------------------------------
  17. # ● 转换大数字的显示位数
  18. #     x : 要转换的数字,必须是整数(Fixnum/Bignum),可正可负
  19. #     method : 舍入处理规则,合法取值有5个
  20. #       "round" : 四舍五入(默认)1.4=>1  1.5=>2  -1.4=>-1  -1.5=>-2
  21. #       "ceil"  : 向上取整        1.4=>2  1.5=>2  -1.4=>-1  -1.5=>-1
  22. #       "floor" : 向下取整        1.4=>1  1.5=>1  -1.4=>-2  -1.5=>-2
  23. #       "trunc" : 向内取整        1.4=>1  1.5=>1  -1.4=>-1  -1.5=>-1
  24. #       "away"  : 向外取整        1.4=>2  1.5=>2  -1.4=>-2  -1.5=>-2
  25. #       (写成不是另外四种取值的字符串,都会以"round"处理)
  26. #--------------------------------------------------------------------------
  27. def convert_number(x, method = "round")
  28.   # 负数前置处理
  29.   neg = x < 0
  30.   # 字符串度量化
  31.   str = x.abs.to_s
  32.   len = str.length
  33.   exp = (len - MIN_DIGITS) / EXP_SIZE
  34.   delimit = exp * EXP_SIZE
  35.   # 小数点前截取
  36.   before = str[0..-delimit - 1].to_i
  37.   # 小数点后截取
  38.   after = delimit > 0 ? str[-delimit, DECIMALS].to_i : 0
  39.   # 进位处理
  40.   if delimit > DECIMALS
  41.     round = str[-delimit + DECIMALS, 1].to_i
  42.     case round
  43.     when 0
  44.       carry = (method == (neg ? "floor" : "ceil") || method == "away") &&
  45.         str[-delimit +  DECIMALS + 1..-1].to_i == 0
  46.     when 1..4
  47.       carry = (method == (neg ? "floor" : "ceil") || method == "away")
  48.     when 5..9
  49.       carry = (method != (neg ? "ceil" : "floor") && method != "trunc")
  50.     end
  51.     if carry
  52.       after += 1
  53.       if after == 10 ** DECIMALS
  54.         before += 1
  55.         after = 0
  56.       end
  57.     end
  58.   end
  59.   # 按有无小数点分别输出
  60.   if DECIMALS > 0 and delimit > 0
  61.     digits = [DECIMALS, delimit].min
  62.     result = sprintf("%d.%0#{digits}d%s", before, after, EXP_WORDS[exp])
  63.   else
  64.     result = sprintf("%d%s", before, EXP_WORDS[exp])
  65.   end
  66.   # 负数后置处理,返回
  67.   return neg ? "-" + result : result
  68. end
SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-9-20 01:01

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表