2015-10-31 2 views
-3
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 

После написания этой функции, по-видимому, я написал ее так, как если бы я сделал номер, он не считает, что это число. Есть ли лучший способ написать его, чтобы он не был настолько запутанным и неправильным?Почему эта функция IsNum не так?

+4

'IsNumeric (textBox.Text)' он использует свойство Text, а не текстовое поле. – OneFineDay

ответ

2

Вам нужно проверить текст внутри текстового поля. Не текстовое поле.

ли это вместо того, чтобы ..

If IsNumeric(textBox.Text) = False Then 
+2

Спасибо. Я знал, что у меня пропало то, что мой глаз не мог поймать. Было написано слишком много кода. Благодарю. – boboobobo

+0

Существует также ограничение на размер числа при использовании isNumeric. Я не могу точно запомнить размер, но как только вы нажмете этот предел isNumeric всегда false. – EJD

3

Поскольку вы используете .NET Framework (на основе тега vb.net) - я предлагаю использовать strongtyped разбор текста на номер

Я предполагаю, что вы знаете, какие типа номера вы ожидаете (Int32, Decimal, Double и т.д.)

Используйте TryParse метод Int32.TryParse Method

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 
1

Существует несколько способов приблизиться к этому. Сначала нужно использовать элемент управления 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 

Если ни один из них не удовлетворить ваши потребности, я бы с предложением Фабио.

Смежные вопросы