簡體   English   中英

驗證用戶輸入的十進制數

[英]Validating user input of decimal number

我有一個wpf文本框,我想檢查一下用戶輸入的內容是否僅使用0 1 2 3 4 5 6 7 8 9。 [小數點]字符代表十進制數字。 我稍后將使用此文本框轉換為小數

我將以下文章用作起點正則 表達式匹配 預覽文本輸入示例 正則表達式允許一個十進制數或一個十進制數范圍

這是我的xaml

<TextBox Grid.Column="1" Height="28" HorizontalAlignment="Left" Margin="10,10,0,0" Name="tbTaxFreeLimit" Width="90" VerticalAlignment="Top" 
                                             AcceptsTab="True" 
                                             PreviewTextInput="tbDecimalCheck_PreviewTextInput"
                                            />

和C#

private void tbDecimalCheck_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
     // Test for decimal
     if (IsNumeric(e.Text)==false)
         e.Handled = true;
}

private bool IsNumeric(string s)
{
    Regex r = new Regex(@"^[0-9]");

    return r.IsMatch(s);
}

此示例適用於0 1 2 3 4 5 6 7 8 9,但我不能輸入小數點。

如果我將下面的代碼更改為以下代碼,則無效

Regex r = new Regex(@"^[0-9].");

您的正則表達式^[0-9]. 從字符串的開頭說匹配0-9范圍內的一個字符,然后匹配任何字符( .表示任何字符)。 那不是你想要的。 您需要匹配任意數量的字符,可選的小數點,然后再匹配更多的數字。 就像是:

^\d+\.?\d*$

表示1個或多個( + )數字( \\d等於[0-9] ),0或1( ? )小數點(必須對.進行轉義以匹配文字.因此\\. ),然后是0或更多( * )位。

這可以修復您的正則表達式,但是在文本輸入上執行此操作很decimal.TryParse最好讓用戶輸入文本,然后使用decimal.TryParse進行驗證( decimal.TryParse而不是嘗試在鍵入時進行限制。 為什么? 考慮用戶輸入:

1     // this is valid

接着:

1.    // this is still valid

接着:

1.2   // still valid

然后他們意識到它們的意思是2.2 ,所以它們做什么? 他們刪除1給出:

.2     // Buzzzz, not valid

對於用戶而言,這確實很煩人。 用戶嘗試刪除1並且該控件頑固地拒絕更改。 為什么? 用戶不知道。 不要將輸入的用戶輸入變成“猜測規則是什么”的游戲。

要考慮的另一件事對您來說可能是,也可能不是問題,因為並非所有文化都在使用. 作為小數點分隔符。 實際上,世界上大部分地區都不是

因此,不要取消文本輸入,請使用TryParse (具有適當的文化設置),並在TextBox上設置錯誤,而不是停止用戶輸入文本。 只是在解決數字輸入問題之前,不要讓用戶進入下一步。

正則表達式可能不是執行此操作的最易讀/可維護的方法。

嘗試解析它;

private bool IsNumeric(string s) => decimal.TryParse(s, out var value);

就像是:

Regex r = new Regex(@"^\d+\.?\d*$");

說明:“ ^”匹配字符串的開頭; \\ d +與一個或多個數字匹配。 匹配可選的小數點,\\ d *匹配零個或多個數字。 “ $”匹配字符串的結尾。

System.Text.RegularExpressions.Regex.IsMatch(txtTransactionAmount.Text, @"[^0-9].[^0-9]")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM