You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 01:17:24