簡體   English   中英

為什么這個 IsNum 函數是錯誤的?

[英]Why is this IsNum function wrong?

    Private Function IsNum(textBox As TextBox, name As String) As Boolean
    If IsNumeric(textBox) = False Then
        MessageBox.Show(name & " is not a number.", "Entry Error")
        textBox.Select()
        Return False
    Else
        Return True
    End If
End Function

寫完這個函數后,顯然我以某種方式編寫它,如果我創建一個數字,它不會認為它是一個數字。 有沒有更好的方法來編寫它,這樣它就不會那么混亂和不正確?

由於您使用 .NET Framework(基於標簽vb.net ) - 我建議使用強類型文本解析到數字

我假設您知道您期望的數字類型( Int32DecimalDouble等)

使用TryParse方法Int32.TryParse 方法

Private Function IsNum(textBox As TextBox, name As String) As Boolean
    Dim temp As Integer
    If Integer.TryParse(textBox.Text, temp) = False Then
        MessageBox.Show(name & " is not a number.", "Entry Error")
        textBox.Select()
        Return False
    End If
    'If values is valid you can use valid Integer for your purposes
    Me.SomeInteger = temp
    Return True
End Function

您需要檢查文本框中的文本。 不是文本框本身。

改為這樣做..

 If IsNumeric(textBox.Text) = False Then

有幾種方法可以解決這個問題。 首先是使用 NumericUpDown 控件或僅接受數字輸入的自定義 TextBox,如下所示,它還考慮了從 Windows 剪貼板粘貼的數據。 將類添加到您的項目中,構建,在 IDE 工具箱的頂部單擊自定義文本框以添加到您的表單中並簡單地使用它。

Public Class numericTextbox
    Inherits TextBox

    Const WM_PASTE As Integer = &H302

    Protected Overrides Sub OnKeyPress(ByVal e As System.Windows.Forms.KeyPressEventArgs)
        Dim Value As String = Me.Text
        Value = Value.Remove(Me.SelectionStart, Me.SelectionLength)
        Value = Value.Insert(Me.SelectionStart, e.KeyChar)
        e.Handled = CBool(Value.LastIndexOf("-") > 0) _
           Or Not (Char.IsControl(e.KeyChar) OrElse _
           Char.IsDigit(e.KeyChar) OrElse _
           (e.KeyChar = "."c And Not Me.Text.Contains(".") Or _
           e.KeyChar = "."c And _
           Me.SelectedText.Contains(".")) OrElse (e.KeyChar = "-"c And Me.SelectionStart = 0))
        MyBase.OnKeyPress(e)
    End Sub
    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        If m.Msg = WM_PASTE Then
            Dim Value As String = Me.Text
            Value = Value.Remove(Me.SelectionStart, Me.SelectionLength)
            Value = Value.Insert(Me.SelectionStart, Clipboard.GetText)
            Dim result As Decimal = 0
            If Not Decimal.TryParse(Value, result) Then
                Return
            End If
        End If
        MyBase.WndProc(m)
    End Sub
End Class

另一個依賴於目標框架 3.5 及更高版本的想法是使用擴展方法。

Public Module LanguageExtensions
    ''' <summary>
    ''' Check if Text property of a TextBox is numeric
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <System.Diagnostics.DebuggerStepThrough()> _
    <System.Runtime.CompilerServices.Extension()> _
    Public Function IsNumeric(ByVal sender As TextBox) As Boolean
        Return Integer.TryParse(sender.Text, Nothing) OrElse Double.TryParse(sender.Text, Nothing)
    End Function
    ''' <summary>
    ''' Check if Text Property of a TextBox is a decimal with formatting or not
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <System.Diagnostics.DebuggerStepThrough()> _
    <System.Runtime.CompilerServices.Extension()> _
    Public Function IsNumericWithCurrency(ByVal sender As TextBox) As Boolean
        Return Decimal.TryParse(sender.Text, Globalization.NumberStyles.Currency, Nothing, Nothing)
    End Function

End Module

擴展方法示例

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If TextBox1.IsNumericWithCurrency Then
            MessageBox.Show("Yes")
        Else
            MessageBox.Show("No")
        End If
    End Sub
End Class

如果這些都不適合您的需求,我會同意法比奧的建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM