如何用C#在Unity中实现类似Cash Inc的分阶大额货币系统?
分阶货币系统实现方案
现有代码问题分析
- 类型选择错误:
int类型最大值仅为2147483647,完全无法满足放置类游戏后期超大数值需求,且整数除法会丢失小数精度,导致格式化后数值缺失小数位 - 逻辑错误:1亿(100000000)区间的除数误用10亿(1000000000),会导致该区间数值格式化后返回
0B的错误结果 - 扩展性差:单位仅写死支持到B(十亿),且用多分支硬编码判断,后续新增高阶单位需要大量修改代码
- 逻辑冗余:10万、1万区间的判断规则完全重复,没有必要
最优实现方案
1. 数值类型选择
根据需求的数值范围选择对应类型即可:
- 数值上限不超过7.9e28:直接用
decimal类型,无浮点精度误差,性能足够 - 需要无上限超大数值:引入
System.Numerics.BigInteger,Unity 2021及以上版本原生支持,旧版本可导入第三方轻量BigInteger库实现
2. 优化后的格式化代码
无需硬编码分支判断,动态计算阶位对应单位,可支持任意高阶单位扩展:
using System; public static class CurrencyFormatter { // 按Cash Inc的单位规则扩展,可按需新增后续单位 private static readonly string[] _units = { "", "K", "M", "B", "T", "aa", "ab", "ac", "ad", "ae", "af", "ag" }; public static string Format(decimal amount) { if (amount < 1000) { return amount.ToString("#,0"); } int unitIndex = 0; decimal adjustedAmount = amount; while (adjustedAmount >= 1000 && unitIndex < _units.Length - 1) { adjustedAmount /= 1000; unitIndex++; } // 保留1位小数,不需要则修改格式字符串为"0" return adjustedAmount.ToString("0.#") + _units[unitIndex]; } // BigInteger版本适配 public static string Format(System.Numerics.BigInteger amount) { if (amount < 1000) { return amount.ToString("#,0"); } int unitIndex = 0; decimal adjustedAmount = (decimal)amount; while (adjustedAmount >= 1000 && unitIndex < _units.Length - 1) { adjustedAmount /= 1000; unitIndex++; } return adjustedAmount.ToString("0.#") + _units[unitIndex]; } }
3. 自定义调整说明
- 需要调整保留小数位数:修改
ToString的格式字符串,固定1位小数用"0.0",不需要小数用"0" - 需要新增高阶单位:直接在
_units数组末尾追加对应单位字符串即可,无需修改逻辑代码 - 需要和Cash Inc显示规则完全对齐:可根据游戏实际规则调整阶位阈值,比如部分区间显示整数、部分区间显示小数,添加对应分支判断即可
内容的提问来源于stack exchange,提问作者ChilledOwl
相关产品推荐
相关产品推荐

