0

私が試みたこの問題を解決するのに何時間もかかりましたが、成功しませんでした。必要なのは、テキストボックスを検証することだけです:

有効なチェーン:

10% 
 0% 
 1111111.12% 
 15.2% 
 10 
 2.3 

無効なチェーン:

 .% 
 12.% 
 .02% 
 % 
 123456789123.123 

キープレス イベントをサポートするこれらの有効なチェーンでテキスト ボックスを検証する必要があります。

私が試した:

Private Sub prices_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles wholeprice_input_new_item.KeyPress, dozenprice_input_new_item.KeyPress, _
            detailprice_input_new_item.KeyPress, costprice_input_new_item.KeyPress

            Dim TxtB As TextBox = CType(sender, TextBox)
            Dim fullText As String = TxtB.Text & e.KeyChar
            Dim rex As Regex = New Regex("^[0-9]{1,9}([\.][0-9]{1,2})?[\%]?$ ")

            If (Char.IsDigit(e.KeyChar) Or e.KeyChar.ToString() = "." Or e.KeyChar = CChar(ChrW(Keys.Back))) Then
                If (fullText.Trim() <> "") Then
                    If (rex.IsMatch(fullText) = False And e.KeyChar <> CChar(ChrW(Keys.Back))) Then
                        e.Handled = True
                        MessageBox.Show("You are Not Allowed To Enter More then 2 Decimal!!")
                    End If
                End If
            Else
                e.Handled = True
            End If
        End Sub

注:正規表現は、オプションのパーセント記号を使用して検証する必要があります (最大小数点以下 2 桁、整数 9 桁)。

助けてください、成功せずに問題を解決しようとしてとてもイライラしています

4

1 に答える 1

1

ほぼ正解だったと思います。提供されたサンプルに対して正規表現を実行すると、すべて失敗します。しかし、正規表現の最後にある余分なスペースを削除すると、期待どおりの成功と失敗が得られます。

したがって、現在、正規表現は次のようになります。

Dim rex As Regex = New Regex("^[0-9]{1,9}([\.][0-9]{1,2})?[\%]?$ ")

そしてそれは次のように見えるはずです

Dim rex As Regex = New Regex("^[0-9]{1,9}([\.][0-9]{1,2})?[\%]?$")

編集:

わかりました私は問題をもっと理解しています。正規表現の問題は、ピリオドの後に 1 つまたは 2 つの数字が続く場合にのみピリオドを使用できることです。誰かが入力を終えた後にテキストボックスの値を評価している場合、これはうまく機能します。ただし、コードでは、キーを押すたびに評価しているため、「。」の後に数字を入力する機会がありません。

考えられる解決策が 2 つあります

  1. 1. を有効なエントリとして許可するように正規表現を変更します
  2. 正規表現を評価するときに変更します。おそらく、人が入力を一時停止したときにのみ正規表現を評価する方法を見つけようとします。

オプション 1 を選択した場合は、正規表現を次のように微調整する必要があります。

"^[0-9]{1,9}((\.)|(\.[0-9]{1,2}(%)?)|(%))?$"

(\.)正規表現を変更して、テキスト文字列の 3 つのオプションの末尾を受け入れるようにしまし(\.[0-9]{1,2}(%)?)(%)パーセント記号で終わります。12.% のようなものを有効にしたくないので、エンディングを 3 つのオプションに分けました。また、これを機能させるには、最初の If ステートメントにパーセント記号を追加する必要もあります

If (Char.IsDigit(e.KeyChar) Or e.KeyChar.ToString() = "." Or e.KeyChar.ToString() = "%" Or e.KeyChar = CChar(ChrW(Keys.Back))) Then

誰かがパーセント記号を入力したときに正規表現が実行されるようにします。

于 2012-05-12T03:39:34.717 に答える