Project1

标题: 数字位数多转为单位(ai生成的脚本) [打印本页]

作者: ppspssss    时间: 2024-8-13 22:28
标题: 数字位数多转为单位(ai生成的脚本)
本帖最后由 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,
用中文的话若改成万,亿和万亿 就好多了

万,亿和万亿版本

#########




作者: alexncf125    时间: 2024-8-14 00:38
p format_number_with_unit(1234567)输出了1百万哦
作者: 939034448    时间: 2024-8-14 02:32
超过万亿会出错是因为数据溢出了吧,没准输入30亿也会报错
作者: ppspssss    时间: 2024-8-14 10:28
本帖最后由 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字节太小,如何扩大位数

作者: 939034448    时间: 2024-8-28 17:07
ppspssss 发表于 2024-8-14 10:28
回2楼:谢谢,已改正,輸出:1百万
回3楼:应该会支持更长的数字?我是问AI才知道Ruby好像能够输入任意长 ...

直接计算也许是支持的,但是你贴出来的函数应该是有设计到强转,数据类型转换这种,可能会有所限制,ruby的数据类型确实不严格,基本会自适应
作者: soulsaga    时间: 2024-8-28 17:48
是在取整时有上限?
作者: SailCat    时间: 2024-9-1 02:11
本帖最后由 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





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1