1

我正在上 VBA 课程并且完全被这个问题所困扰。我们不能使用屏蔽文本框,这可以解决这个问题。相反,教授实际上希望我学习代码,你能想象吗?

别开玩笑了,用户需要在文本框中输入汽油价格,然后点击计算以接收旅行的总费用。界面还有更多内容,但会为您省去细节。如果用户输入的数字不是带一位小数的正数,它应该返回错误。我已经计算出 0 或 0000 以及负数,例如 -3.45。现在我必须得到任何文本或特殊字符来给我一个错误以及类似 34.56.12.45 的内容。您永远不会知道,用户可能会觉得需要输入他们的 IP 地址。分配的关键是我捕捉到所有可能的用户错误。

这是我为计算编写的以及捕获错误的内容。我也尝试过 Try/Catch 语句。没有任何效果,但我让 IF 语句的前两部分工作,但在最后一个 IF 部分总是失败,直到它开始计算。

Private Sub btnCalc_Click(sender As Object, e As EventArgs) 处理 btnCalc.Click

    Dim Mileage As Decimal
    Dim Miles As Decimal
    Dim GasPrice As Decimal
    Dim Cost As Decimal


    If CDec(txtbxGasPrice.Text) = 0 Then
        MessageBox.Show("Please enter a positive dollar amount")
        txtbxGasPrice.Text = String.Empty
    End If
    If CDec(txtbxGasPrice.Text) < 0 Then
        MessageBox.Show("Please enter a positive dollar amount")
        txtbxGasPrice.Text = String.Empty
    End If
    If Cost = CDec((Miles / Mileage) * GasPrice) Then

        Miles = CDec(lblTMiles.Text)
        Mileage = CDec(lblMileage.Text)
        GasPrice = CDec(txtbxGasPrice.Text)

        lblTotalCost.Text = Cost.ToString("C2")
    End If
    If CBool(txtbxGasPrice.Text = "") Then
        MsgBox("You must enter a dollar amount")
    End If

    *If Not IsNumeric(txtbxGasPrice.Text) Then
        MessageBox.Show("Please enter a positive dollar amount")
        txtbxGasPrice.Text = String.Empty*
    End If

End Sub

“我把它放在了顶部、中间、底部,但没有运气。我错过了什么?

欣赏你的想法 - 劳伦

4

3 回答 3

2

这个似乎符合您的标准并通过了大卫的测试:

Function IsValid(txt As String) As Boolean
If Not IsNumeric(txt) Then
    Exit Function
End If
If Len(txt) < 2 Then
    Exit Function
End If
If Not Mid(txt, Len(txt) - 1, 1) = "." Then
    Exit Function
End If
If Not txt > 0 Then
    Exit Function
End If
IsValid = True
End Function

在此处输入图像描述

于 2013-10-07T05:32:22.670 回答
1

这似乎是正则表达式的完美应用,但可能超出了这个问题的范围,尽管 vb 有一个 Decimal.TryParse(或解析),它将接受一个字符串并尝试将其解析为小数,但可能会更好。

http://msdn.microsoft.com/en-us/library/system.decimal.tryparse.aspx

另一方面,我不是 100% 确定它如何与 xx.xx.xx 一起工作,但我打赌它会失败并帮助你解决问题

于 2013-10-07T01:46:17.210 回答
0

我将扩展CSgoose的想法以使用RegEx,它似乎更可靠。在使用 RegEx 时我非常非常绿色,但我尝试在 SO 上使用 Q,所以这可能不是匹配的最佳模式,但是当我测试一些值时,这样的函数似乎可以解决问题.

  • 0/0.0/0.00 = 假
  • -1.5 = 假
  • 1.5 = 真
  • 5.45 = 错误
  • 史蒂夫 = 假
  • Steve.6 = 错误
  • Steve6.58 = 假
  • 6.574.2 = 假

计算结果为的值0将返回 false。负值返回 false。值必须有一个小数部分,由任何数字组成(如果你想限制它,可以调整它,例如,##.#格式化等)。仅匹配全文,因此 IP 地址等内容不会返回 true 等。

注意这是 VBA,但应该很容易适应您的目的)

Sub YourSub()

If Not IsMatch(CStr(txtbxGasPrice.Text)) Then
    MsgBox "Please ensure that the value you enter is a positive dollar amount, to 1 decimal place!", vbCritical, "Invalid Gas Price Value!"
End IF

End Sub

此功能需要启用对 的引用Microsoft VBScript Regular Expressions 5.5,或者您可以使用后期绑定。

Function IsMatch(str As String) As Boolean
'Tests for a positive numeric value, formatted 0.0 with a mandatory decimal component
' exact match only
Dim re As RegExp
Dim allMatches As MatchCollection
Dim retVal As Boolean
    retVal = False 'by default
    If Not IsNumeric(str) Then GoTo EarlyExit 'ignore any non-numeric value
    Set re = New RegExp
    re.Pattern = "\d*\.[0-9]"
    Set allMatches = re.Execute(str)
    If allMatches.Count = 1 Then
    'If there are multiple matches, then I think safe to say it's not a match,
    ' make sure it's a full string match
        If str > 0 Then
            retVal = (allMatches(0) = str)
        End If
    End If
EarlyExit:
    Set re = Nothing
    IsMatch = retVal
End Function

更新强制,例如,##.# 格式,你可以这样做

 re.Pattern = "[1-9]?\d\.\d"
于 2013-10-07T03:36:34.447 回答