VB.NET薪资计算写入RichTextBox报错、计算结果为0问题求解
问题根因
两个异常和逻辑错误的核心来源:
- 格式转换报错:直接使用
Convert.ToInt32转工作天数输入时,若用户输入非数字内容会直接抛出转换错误;若选中职位未匹配到对应的日薪赋值分支,Integer类型的DailyPay会保持默认值0,后续隐式类型转换会误把拼接完成的员工信息字符串当成数值尝试转Double,触发Conversion from string "Employee ID: ..." to type "Double" is not valid报错。 - 总薪资恒为0:将DailyPay、total声明为字符串类型后,字符串无法直接参与算术乘法运算,未赋值的字符串默认是空值,参与数值运算时会被编译器默认转为0,最终计算结果始终为0。
- 隐藏逻辑漏洞:原有多层If-Else职位匹配无兜底分支,遇到未配置日薪的职位时无任何提示,直接输出0值总薪资。
修正后可直接运行的代码
Private Sub Guna2Button1_Click(sender As Object, e As EventArgs) Handles Guna2Button1.Click Dim DailyPay As Integer = 0 Dim workDays As Integer = 0 Try ' 员工选择校验 If String.IsNullOrWhiteSpace(empposition.Text) Then MsgBox("请先选择员工") Return End If ' 工作天数合法性校验,从根源避免非数字输入触发格式异常 If Not Integer.TryParse(wdays.Text, workDays) OrElse workDays <= 0 OrElse workDays > 28 Then MsgBox("请输入1-28之间的有效工作天数") Return End If ' 匹配职位对应日薪 Select Case empposition.Text.Trim() Case "Receptionist" : DailyPay = 120 Case "Reception manager" : DailyPay = 200 Case "House keeping manager" : DailyPay = 100 Case "Bar manager" : DailyPay = 200 Case "Barman" : DailyPay = 130 Case "Waiter" : DailyPay = 100 Case "Vendor" : DailyPay = 125 Case "Shop manager" : DailyPay = 200 Case "IT manager" : DailyPay = 200 Case "Technicien" : DailyPay = 120 Case "Spa manager" : DailyPay = 180 Case "Beautician" : DailyPay = 80 Case "Security man" : DailyPay = 100 Case Else MsgBox("当前选中职位未配置日薪标准") Return End Select ' 全程使用数值类型计算总薪资,计算完成后再转字符串输出 Dim total As Integer = DailyPay * workDays ' 拼接薪资信息输出到RichTextBox控件 Salarybox.Text = $"Employee ID: {empid.Text}{vbLf}" & $"Employee Name: {ename.Text}{vbLf}" & $"Employee LastName: {lastname.Text}{vbLf}" & $"Position: {empposition.Text}{vbLf}" & $"Worked Days: {workDays}{vbLf}" & $"Daily Salary: {DailyPay}{vbLf}" & $"Total Amount: {total}" Catch Ovex As OverflowException MsgBox("计算数值超出合法范围,请检查输入") Catch ex As Exception MsgBox($"运行出错:{ex.Message}") End Try End Sub
关键修正说明
- 参与算术计算的
DailyPay、workDays、total全程使用Integer数值类型,仅在最后拼接输出时自动转为字符串,彻底避免字符串参与乘法导致结果为0的问题。 - 用
Integer.TryParse替代直接Convert.ToInt32做输入校验,用户输入非数字内容时不会触发格式异常,直接弹出友好提示。 - 改用Select Case结构匹配职位,比多层If-Else更易维护,新增Case Else兜底分支处理未配置日薪的职位,避免无提示输出0值薪资。
- 每一步校验不通过时直接终止后续逻辑执行,避免无效运算触发异常。
内容的提问来源于stack exchange,提问作者khadiiijah
相关产品推荐
相关产品推荐

