[英]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.