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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 03:42:30