3

小数に一致する次の正規表現があります。

@"[\d]{1,4}([.][\d]{1,2})?"

しかし、複数の小数点を入力できます。どうすればこれを防ぐことができますか? 通常、「2000」や「2000.22」などの入力文字列を使用できます。decimal.TryParse を使用しようとしましたが、2 つの小数点を入力できます (例: 2000..)

検証のためのメソッドを持つ私のクラスは次のとおりです。

 public static class ValidationUtils
 {
    public static bool IsValid(string text)
    {
        var regex = new Regex(@"^\d{1,9}([.]\d{1,2})?$");
        var success = regex.IsMatch(text);

        return success;
    }
 }

ページのコード開始での呼び出しは次のとおりです。

private void OnPreviewTextInput(object sender, TextCompositionEventArgs eventArgs)
{
    var box = eventArgs.OriginalSource as TextBox;
    if (box == null) return;
    eventArgs.Handled = !ValidationUtils.IsValid(box.Text + eventArgs.Text);
}

そして TextBox の xaml:

 <TextBox Text="{Binding Nominal, Mode=TwoWay,
 StringFormat={}{0:0.######}, UpdateSourceTrigger=PropertyChanged, 
 NotifyOnValidationError=True, ValidatesOnDataErrors=True,
 Converter={StaticResource  decimalValueConverter}}"
 PreviewTextInput="OnPreviewTextInput"/>

ここで間違ったイベントを使用していますか?

ありがとうございます。

4

3 に答える 3

5

正規表現を固定する必要があります。

@"^\d{1,4}([.]\d{1,2})?$"

^文字列の先頭に一致

$文字列の末尾に一致

そうしないと、部分一致が得られます。

于 2013-05-29T12:47:59.130 に答える
3

問題は、正規表現が存在する場合、最後の 2 つの数字まで一致するため、文字列を一致と見なすことです。数値が最後の桁で終わる必要があることを正規表現に伝えるには、アンカーが必要です。

^\d{1,4}([.]\d{1,2})$

を角かっこで囲む必要はありません。次のようにドットをエスケープするために\d使用できます。\.

^\d{1,4}(\.\d{1,2})$
于 2013-05-29T12:49:08.803 に答える
1

いくつかのことを行う必要があります。最初に、^ で始まり、$ で終わる必要があります。これにより、不要な開始文字または終了文字がないようにします。次に、. をエスケープする必要があります。それをリテラルにします。すでに指摘したように、 ? が必要になります。グループ化後の .## 部分は必須ではありませんが、許可されています。

これにより、最終的な正規表現は次のようになります。

@"^\d{1,4}(\.\d{1,2})?$";
于 2013-05-29T12:53:32.217 に答える