2015-09-09 21 views
0

我有一個wpf文本框,我想檢查用戶輸入它是否只使用0 1 2 3 4 5 6 7 8 9。小數點的[小數點]字符。我用這個文本框轉換爲十進制後驗證用戶輸入的十進制數

我使用的後續文章爲起點 Regex MatchPreview Text Input exampleregex-to-allow-one-decimal-number-or-a-range-of-decimal-number

這是我的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但我不能輸入十進制po int。

如果我改變了對下面的代碼在它下面有沒有

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

如何使用'decimal.Parse'而不是正則文化設置的正則表達式?正則表達式不是這種情況下的最佳方式。 –

+1

而不是正則表達式嘗試將輸入值實際轉換爲「decimal」。如果失敗 - 顯示紅色邊框。 – Sinatr

+0

@SonerGönül更好'decimal.TryParse'。 – juharr

回答

4

你的正則表達式^[0-9].是從字符串匹配開始說0-9範圍內的一個字符,然後匹配任何字符(.意味着任何字符)。這不是你想要的。你需要匹配任意數量的字符,一個可選的小數點,然後再多一些數字。類似:

^\d+\.?\d*$ 

它說1或多個(+)數字(\d相當於[0-9]),0或1(?)十進制點(.來轉義以匹配字面.因此\.)然後是0或更多(*)數字。

這修復了你的正則表達式,但是在文本輸入上做這件事是一種痛苦,你最好讓用戶輸入文本,然後用類似decimal.TryParse的東西來驗證它,而不是在輸入時限制它們。爲什麼?考慮用戶輸入:

1  // this is valid 

然後:

1. // this is still valid 

然後:

1.2 // still valid 

然後他們意識到他們的意思2.2,所以他們在做什麼?他們刪除1給予:

.2  // Buzzzz, not valid 

這真的很煩人的用戶。用戶嘗試刪除1,並且控件頑固地拒絕更改。爲什麼?用戶不知道。不要把輸入的用戶輸入變成一個「猜測規則是什麼」的遊戲。

要考慮的另一件事,對您而言可能是也可能不是問題,並非所有文化都使用.作爲小數點分隔符。其實most of the world doesn't

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

+0

感謝您的回答和解釋。我的目的是確保對輸入的控制,但是我可以看到它會如何令用戶感到沮喪。我使用TryParse方法進行最終驗證,所以我只需要擴展它就可以了。錯誤,你的意思是像一個錯誤的原因提示工具提示翻轉文本框旁邊的十字圖標? –

+0

@IanW:是的。控件周圍的紅色邊框是指示錯誤的非常常見的元素。如果用戶不清楚問題是什麼,那麼工具提示也很有用。 –

+0

感謝您的提示,非常感謝 –

1

喜歡的東西效果:

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

說明: 「^」 的字符串開始處匹配; \ d +匹配一個或多個數字\。匹配一個可選的小數點,\ d *匹配零個或多個數字。 「$」匹配字符串的末尾。

2

正則表達式可能不是最具可讀性/可維護性的方法。

嘗試解析它;

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