System.ArgumentException: 'Argument 'NPer' 不是有效值

问题描述

然后我能够调试我的编码,当我点击“计算”按钮时,错误消息

System.ArgumentException: 'Argument 'NPer' 不是有效值。'

弹出(第一张图片)。第二张图片是我的应用程序。重置按钮和退出按钮有效,但是当我点击“计算”按钮时它不起作用。

enter image description here

enter image description here

Public Class Form1

   Const dblMonths_Year As Double = 12
   Const dblNew_Rate As Double = 0.05
   Const dblUsed_Rate As Double = 0.08
   Dim dblAnnualRate As Double = dblNew_Rate

    Private Sub btncalculate_Click(sender As Object,e As EventArgs) Handles btncalculate.Click


        Dim dblVehicleCost As Double
        Dim dblDownPayment As Double
        Dim dblMonths As Double
        Dim dblLoan As Double
        Dim dblMonthlyPayment As Double
        Dim dblInterest As Double
        Dim dblPrincipal As Double
        Dim intCount As Integer
        Dim strOut As String
        Dim blnInputOK As Boolean = True



        If blnInputOK = True Then
            dblLoan = dblVehicleCost - dblDownPayment
            dblMonthlyPayment = Pmt(dblAnnualRate / dblMonths_Year,dblMonths,-dblLoan)
            lstOutput.Items.Clear()

            For intCount = 1 To dblMonths
                dblInterest = IPmt(dblAnnualRate / dblMonths_Year,intCount,-dblLoan)
                dblPrincipal = PPmt(dblAnnualRate / dblMonths_Year,-dblLoan)
                strOut = "Month" & intCount.ToString("d2")
                strOut &= ": payment =" & dblMonthlyPayment.ToString("n2")
                strOut &= ",interest =" & dblInterest.ToString("n2")
                strOut &= ",principal =" & dblPrincipal.ToString("n2")
                lstOutput.Items.Add(strOut)

            Next

        End If


    End Sub

    Private Sub btnReset_Click(sender As Object,e As EventArgs) Handles btnReset.Click
        radNew.Checked = True
        dblAnnualRate = dblNew_Rate
        lblAnualRate.Text = dblNew_Rate.ToString("p")
        txtCost.Clear()
        txtDownPayment.Clear()
        txtMonths.Clear()
        lstOutput.Items.Clear()
        txtCost.Focus()

    End Sub

    Private Sub btnExit_Click(sender As Object,e As EventArgs) Handles btnExit.Click
        Close()
    End Sub

    Private Sub radNew_CheckedChanged(sender As Object,e As EventArgs) Handles radNew.CheckedChanged
        If radNew.Checked = True Then
            dblAnnualRate = dblNew_Rate
            lblAnualRate.Text = dblNew_Rate.ToString("p")
            lstOutput.Items.Clear()

        End If
    End Sub

    Private Sub radUsed_CheckedChanged(sender As Object,e As EventArgs) Handles radUsed.CheckedChanged
        If radUsed.Checked = True Then
            dblAnnualRate = dblUsed_Rate
            lblAnualRate.Text = dblUsed_Rate.ToString("p")
            lstOutput.Items.Clear()

        End If
    End Sub
End Class

解决方法

您需要从输入字段设置变量,最好确保用户输入了合理的值,例如:

Public Class Form1

    Const MONTHS_PER_YEAR = 12
    Const NEW_RATE = 0.05
    Const USED_RATE = 0.08
    Dim annualInterestRate As Double = NEW_RATE

    Private Sub btnCalculate_Click(sender As Object,e As EventArgs) Handles btnCalculate.Click

        Dim vehicleCost = 0.0D
        Dim downPayment = 0.0D
        Dim monthsToPay = 0

        Dim inputOk = Decimal.TryParse(tbCost.Text,vehicleCost) AndAlso
                      Decimal.TryParse(tbDownPayment.Text,downPayment) AndAlso
                      Integer.TryParse(tbMonthsToPay.Text,monthsToPay)

        If inputOk Then
            lstOutput.Items.Clear()

            Dim loanAmount = vehicleCost - downPayment
            Dim monthlyPayment = Pmt(annualInterestRate / MONTHS_PER_YEAR,monthsToPay,-loanAmount)

            For monthNumber = 1 To monthsToPay
                Dim interestPayment = IPmt(annualInterestRate / MONTHS_PER_YEAR,monthNumber,-loanAmount)
                Dim principalPayment = PPmt(annualInterestRate / MONTHS_PER_YEAR,-loanAmount)
                Dim strOut = $"Month {monthNumber:D2}"
                strOut &= $": payment = {monthlyPayment:C2}"
                strOut &= $",interest = {interestPayment:C2}"
                strOut &= $",principal = {principalPayment:C2}"
                lstOutput.Items.Add(strOut)

            Next

        End If

    End Sub

    ' other code here

End Class

约定使用 UPPER_SNAKE_CASE 作为常量。变量应该(通常)在使用时声明。

在 VB.NET 中,设置 Option Strict On 和 Option Infer On 以获得更轻松的编程体验。

D 是小数值的 forced literal type。 Decimal 类型应该用于货币,即使 Pmt、IPmt 和 PPmt 函数没有(我怀疑在编写这些函数时 Decimal 类型不可用)。

我使用 interpolated strings 向您展示了如何在您的程序中使用它们:它们有助于提高代码的可读性。

Sample output