C#开发银行柜员应用执行货币计算出现输入字符串格式错误如何解决
问题原因
你在首次取款后调用了FINaccountBalance.ToString("c")将余额格式化为货币字符串,"c"格式说明符会自动在数值前追加当前区域设置的货币符号(例如美元区会生成$900.00这类带$符号的字符串)。
第二次触发取款逻辑时,Decimal.Parse(lblBalance.Text)尝试解析带货币符号的非纯数字字符串,无法匹配默认的数值解析规则,就抛出了格式错误异常。
解决方案
推荐使用更规范的「专用字段存储业务数值」方案,不要把UI标签作为业务数据的存储载体,修改代码如下:
- 首先在窗体类中新增私有字段存储余额,不需要从标签反向解析数值:
// 窗体类内定义余额字段,初始值直接赋值 private decimal _accountBalance = 1000.00m; public Form1() { InitializeComponent(); // 初始化时直接格式化字段值给标签赋值 lblBalance.Text = _accountBalance.ToString("c"); }
- 修改取款按钮的点击逻辑,直接操作余额字段,同时增加输入校验避免其他异常:
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
相关产品推荐
相关产品推荐

