Unity 2D C#自定义按钮二次点击触发FormatException问题求助
问题解决:Unity 2D自定义按钮二次点击FormatException错误
问题根源
你遇到的FormatException完全是因为直接解析带格式的UI文本导致的:
- 第一次点击时,
Money.text是原始纯数字格式(比如1000.00),float.Parse能正常解析; - 点击后你用
string.Format("{0:N2}", ...)修改文本,此时文本会带上千分位逗号(比如数值较大时变成1,234.56),第二次解析时float.Parse无法识别逗号,直接抛出格式错误; - 另外你提到不需要
float类型,确实,金钱类数值用decimal更精准,能避免浮点精度丢失,同时天然支持保留两位小数。
修复方案
核心思路是用变量存储金钱数值,而非依赖UI文本解析,同时替换float为更适合的decimal:
步骤1:添加金钱存储变量
在脚本中新增decimal类型变量保存当前金钱,不再直接操作UI文本:
public decimal currentMoney; // 存储当前金钱数值
步骤2:初始化金钱数值
在Start方法中初始化currentMoney并同步到UI:
void Start() { // 原有初始化代码... // 设置初始金钱(示例值为1000,可自行修改) currentMoney = 1000.00m; // 同步到UI文本 Money.text = currentMoney.ToString("N2"); }
步骤3:修改StockTransferBuy方法
直接操作currentMoney变量,再同步到UI,彻底避免解析带格式文本:
public void StockTransferBuy() { // 将currentPrice转为decimal,避免浮点转换精度问题 decimal price = (decimal)currentPrice; // 扣除对应金额 currentMoney -= price; // 同步到UI,自动保留两位小数 Money.text = currentMoney.ToString("N2"); StockOwned++; }
额外优化(可选但推荐)
如果要彻底解决浮点精度问题,建议把oldPrice和currentPrice也替换为decimal:
public decimal oldPrice; public decimal currentPrice; // Start方法中对应修改: oldPrice = (decimal)Random.Range(startAt + 0.0f, maxRange + 0.0f); if (isRising) { currentPrice = oldPrice + (decimal)Random.Range(0.0f, (maxRange - minRange) + 0.0f); } else { currentPrice = oldPrice - (decimal)Random.Range(0.0f, (maxRange - minRange) + 0.0f); } StockPrice.text = $"{oldPrice:N2} -> {currentPrice:N2}";
为什么之前的.ToString(#.##)没用?
你尝试的.ToString(#.##)只是格式化输出,但没有解决从带格式文本解析的核心问题——只要还在调用float.Parse(Money.text),当文本包含千分位逗号时就会报错,用变量存储数值才是根本解决办法。
内容的提问来源于stack exchange,提问作者NGaines
相关产品推荐
相关产品推荐

