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

C#开发银行柜员应用执行货币计算出现输入字符串格式错误如何解决

问题原因

你在首次取款后调用了FINaccountBalance.ToString("c")将余额格式化为货币字符串,"c"格式说明符会自动在数值前追加当前区域设置的货币符号(例如美元区会生成$900.00这类带$符号的字符串)。
第二次触发取款逻辑时,Decimal.Parse(lblBalance.Text)尝试解析带货币符号的非纯数字字符串,无法匹配默认的数值解析规则,就抛出了格式错误异常。


解决方案

推荐使用更规范的「专用字段存储业务数值」方案,不要把UI标签作为业务数据的存储载体,修改代码如下:

  1. 首先在窗体类中新增私有字段存储余额,不需要从标签反向解析数值:
// 窗体类内定义余额字段,初始值直接赋值
private decimal _accountBalance = 1000.00m;

public Form1()
{
    InitializeComponent();
    // 初始化时直接格式化字段值给标签赋值
    lblBalance.Text = _accountBalance.ToString("c");
}
  1. 修改取款按钮的点击逻辑,直接操作余额字段,同时增加输入校验避免其他异常:
private void btnWithdraw_Click(object sender, EventArgs e)
{
    // 用TryParse校验输入合法性,避免用户输入非数字时崩溃
    if (!decimal.TryParse(txtWithdraw.Text, out decimal withdraw))
    {
        MessageBox.Show("请输入合法的取款金额");
        return;
    }
    // 额外校验取款金额合理性
    if (withdraw <= 0)
    {
        MessageBox.Show("取款金额必须大于0");
        return;
    }
    if (withdraw > _accountBalance)
    {
        MessageBox.Show("余额不足,无法完成取款");
        return;
    }
    // 直接操作字段更新余额,再同步到UI
    _accountBalance -= withdraw;
    lblBalance.Text = _accountBalance.ToString("c");
}

如果不想新增字段,也可以修改解析逻辑适配货币格式,需要引入System.Globalization命名空间,将解析代码改为:

decimal INaccountBalance = Decimal.Parse(lblBalance.Text, NumberStyles.Currency);

该方案稳定性低于字段存储方案,仅作为临时修改参考。


内容的提问来源于stack exchange,提问作者geronim0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:18:02