Разрешить только 2 десятичных знака - PullRequest
2 голосов
/ 19 июня 2011

В текстовом поле окна я бы хотел разрешить только 2 десятичных знака . Я мог установить текстовое поле только числовым, но не знаю, как ограничить 2 десятичных знака.

Например, 743,56

Мой код ниже

  Private Sub txtPrice_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtPrice.KeyPress        
    'allow numeric 
    If Not Char.IsControl(e.KeyChar) AndAlso Not Char.IsDigit(e.KeyChar) AndAlso e.KeyChar <> "."c Then
        e.Handled = True
    End If

    ' only allow one decimal point
    If e.KeyChar = "."c AndAlso TryCast(sender, TextBox).Text.IndexOf("."c) > -1 Then
        e.Handled = True
    End If

   End Sub

Как?

Ответы [ 7 ]

4 голосов
/ 19 июня 2011

Попробуйте использовать NumericUpDown вместо TextBox. A NumericUpDown позволяет вам указывать количество десятичных знаков для перехода к , а также автоматически ограничивать его числами. У вас также есть две удобные маленькие кнопки вверх и вниз.

2 голосов
/ 19 июня 2011

Более простым решением было бы просто использовать:

txtPrice.Text = String.Format("{0:n2}", numberVariableHere);
1 голос
/ 08 июля 2014

Вот код, который я протестировал, я просто даю разрешение пользователю вводить только одну цифру после десятичной точки;вы можете изменить значение до 2 по вашему выбору.

Private Sub tb_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles tb.KeyPress
    If Not Char.IsDigit(e.KeyChar) And Not e.KeyChar = "." Then
        e.Handled = True
    Else
        If e.KeyChar = "." And tb.Text.IndexOf(".") <> -1 Then
            e.Handled = True
        ElseIf e.KeyChar = "." Then
            e.Handled = False
        ElseIf Char.IsDigit(e.KeyChar) Then
            If tb.Text.IndexOf(".") <> -1 Then
                If tb.Text.Length >= tb.Text.IndexOf(".") + 2 Then  'replace 2 for greater numbers after decimal point
                    e.Handled = True
                End If
            End If
        End If
    End If
End Sub

Я проверил этот код до 2,3,4 десятичных знаков

0 голосов
/ 31 августа 2014
Private Sub txtVatRate_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtVatRate.KeyPress
    OnlyAllowPostiveNumbers(sender, e, 1)
End Sub

Public Function OnlyAllowPostiveNumbers(sender As Object, e As System.Windows.Forms.KeyPressEventArgs, Optional ByRef iDeimalPlaces As Integer = 0) As System.Windows.Forms.KeyPressEventArgs
    'Only allow numeric values with the exception of spaces ie '07969 860053' and backspace
    If (Microsoft.VisualBasic.Asc(e.KeyChar) < 48) Or (Microsoft.VisualBasic.Asc(e.KeyChar) > 57) Then
        e.Handled = True
    End If
    'Backspace
    If (Microsoft.VisualBasic.Asc(e.KeyChar) = 8) Then
        e.Handled = False
    End If
    If (Microsoft.VisualBasic.Asc(e.KeyChar) = 46) And InStr(sender.text, ".") < 1 Then
        e.Handled = False
    End If
    If (Microsoft.VisualBasic.Asc(e.KeyChar) > 48) And (Microsoft.VisualBasic.Asc(e.KeyChar) < 57) Then
        If InStr(sender.text, ".") > 0 Then
            Dim n As Integer = InStr(sender.text, ".")
            If n <= (sender.text.length - iDeimalPlaces) Then
                e.Handled = True
            End If
        End If
    End If
    Return e
End Function
0 голосов
/ 08 июля 2014

я думаю, этот код поможет вам решить вашу проблему

dim n as integer 
n=0
 Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
        If e.KeyChar = Chr(46) Then
            n = Len(TextBox1.Text)
        End If
        If Len(TextBox1.Text) >= n + 2 And n <> 0 Then
            TextBox1.Enabled = False
        End If
    End Sub
0 голосов
/ 24 сентября 2012

Попробуйте этот код (разрешены только цифры с десятичной точкой):

Private Sub txtCostPrice_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtCostPrice.KeyPress
    If InStr(txtCostPrice.Text, ".") And e.KeyChar = "." Then e.Handled = True
    If Char.IsDigit(e.KeyChar) = False And Char.IsControl(e.KeyChar) = False Then
        If e.KeyChar <> "." Then e.Handled = True
    End If
End Sub
0 голосов
/ 19 июня 2011

Теперь это работает.Пожалуйста, проверьте мой код ниже

        '2 decimal points only
    'If key-in is after decimal point
    If txtPrice.SelectionStart > txtPrice.Text.IndexOf(Chr(46)) Then
        'If text not select All
        If txtPrice.SelectedText.Length = 0 Then
            If (txtPrice.Text.Trim() <> "") Then
                If (rexPrice.IsMatch(txtPrice.Text) = False) AndAlso e.KeyChar <> ControlChars.Back Then
                    e.Handled = True
                End If
            End If
        End If
    End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...