2

私は次のコードを持っていますが、文字列内のどこにでも小数点以下1桁(ピリオド)しか追加できないという事実を追加しようとしています。

If Asc(e.KeyChar) <> 8 Then
    If Asc(e.KeyChar) < 48 Or Asc(e.KeyChar) > 57 Then
        e.Handled = True
    End If
End If

数値のみを受け入れることで機能しますが、このコードに小数点を1つ組み込むにはどうすればよいですか?

ありがとう

4

4 に答える 4

3

このAsc関数は古いVB6関数であり、新しい.NETコードを作成するときは避ける必要があります。この場合、次のように、キャラクターを比較して、特定の範囲内にあるかどうかを確認できます。

If e.KeyChar <> ControlChars.Back Then
    If (e.KeyChar < "0"c) Or (e.KeyChar > "9"c) Then
        e.Handled = True
    End If
End If

ただし、次のように、有効な文字をリストすることをお勧めします。

e.Handled = ("0123456789.".IndexOf(e.KeyChar) = -1)

複数の小数点をチェックする限り、キープレスイベントで次のようなことを行うことができます。

If e.KeyChar = "."c Then
    e.Handled = (CType(sender, TextBox).Text.IndexOf("."c) <> -1)
ElseIf e.KeyChar <> ControlChars.Back Then
    e.Handled = ("0123456789".IndexOf(e.KeyChar) = -1)
End If

ただし、無効なキーストロークを除外できるのは便利ですが、そうすることには多くの問題があります。たとえば、すべてのチェックを行っても、次のエントリはすべて無効である可能性がありますが、すべて許可されます。

  • 12.12。
  • 0000
  • 0001。

もう1つの大きな問題は、コードがカルチャに依存することです。たとえば、ヨーロッパでは、小数点としてコンマが使用されることがよくあります。これらの理由から、可能であれば、次のようにイベントで使用することをお勧めしDecimal.TryParseますValidating

Private Sub TextBox1_Validating(sender As Object, e As CancelEventArgs) Handles TextBox1.Validating
    Dim control As TextBox = CType(sender, TextBox)
    Dim result As Decimal = 0
    Decimal.TryParse(control.Text, result)
    control.Text = result.ToString()
End Sub
于 2013-03-14T14:58:38.870 に答える
2

文字列(TextBoxのテキストなど)を解析して、すでに小数点が含まれているかどうかを確認します。その場合は、キーを押さないでください。

VB.NET:

Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
    Dim FullStop As Char
    FullStop = "."

    ' if the '.' key was pressed see if there already is a '.' in the string
    ' if so, dont handle the keypress
    If e.KeyChar = FullStop And TextBox1.Text.IndexOf(FullStop) <> -1 Then
        e.Handled = True
        Return
    End If

    ' If the key aint a digit
    If Not Char.IsDigit(e.KeyChar) Then
        ' verify whether special keys were pressed
        ' (i.e. all allowed non digit keys - in this example
        ' only space and the '.' are validated)
        If (e.KeyChar <> FullStop) And
           (e.KeyChar <> Convert.ToChar(Keys.Back)) Then
            ' if its a non-allowed key, dont handle the keypress
            e.Handled = True
            Return
        End If
    End If

End Sub

C#:

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if ((e.KeyChar == '.') && (((TextBox)sender).Text.IndexOf('.') > -1))
    {
        e.Handled = true;
        return;
    }

    if (!Char.IsDigit(e.KeyChar))
    {
        if ((e.KeyChar != '.') &&
            (e.KeyChar != Convert.ToChar(Keys.Back)))
        {
            e.Handled = true;
            return;
        }
    }
}
于 2013-03-14T13:49:54.793 に答える
1

正規表現を使用してみませんか?

これにより、10進数または整数が検証されます。

VB

If New Regex("^[\-]?\d+([\.]?\d+)?$").IsMatch(testString) Then
    'valid
End If

C#

if (new Regex(@"^[\-]?\d+([\.]?\d+)?$").IsMatch(testString))
{
    //valid
}
于 2013-03-14T13:43:09.510 に答える
0

少し複雑です。押した文字が小数の数値であり、前の小数がないことを確認します。

Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
    If Char.IsDigit(e.KeyChar) Or (Asc(e.KeyChar) = Asc(".")) And Me.TextBox1.Text.Count(Function(c As Char) c = ".") = 0 Then e.Handled = False Else e.Handled = True
End Sub
于 2013-03-14T14:24:44.523 に答える