[英]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
) - 我建議使用強類型文本解析到數字
我假設您知道您期望的數字類型( Int32
、 Decimal
、 Double
等)
使用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.