2012-03-07 55 views
0

如何添加一個正則表達式,它將接受小數位(5.23),但在休息時沒有其他內容像這樣?即只處理數字和小數點,如果除此之外的任何內容被輸入或返回,將引發錯誤:正則表達式C#控制檯應用程序

case 1: 
    double[] myArrai1 = new double[3]; 
    Console.WriteLine("Insert a number"); 
    myArrai1[0] = double.TryParse(Console.ReadLine()); // no overload method? 
    Console.WriteLine("Insert a number"); 
    myArrai1[1] = double.Parse(Console.ReadLine()); 
    Console.WriteLine("Insert a number"); 
    myArrai1[2] = double.Parse(Console.ReadLine()); 
    break; 

乾杯傢伙。

P.s不知道如何編程它與中斷也必須是毫無例外。

回答

1

難道你只想驗證一下用戶輸入,或投入無效字符首先阻止他們?

在第一種情況下,並不是真正需要正則表達式。你在double.Parse的正確軌道上,但你想要做的是double.TryParse。首先將用戶輸入讀入一個字符串,然後TryParse把它變成一個double。如果TryParse返回false,則告訴用戶其輸入無效並提示他們再次輸入。

FWIW:這裏就是我會做它(警告:未經測試的代碼),這可能是也可能不是你所需要的:

case 1: 
double[] myArrai1 = new double[3]; 
for (int i=0; i < myArrai1.length; i++) { 
    Console.WriteLine("Insert a number"); 
    while (!double.TryParse(Console.Readline(), out myArrai1[i])) { 
     Console.WriteLine("Invalid entry. Please enter a number."); 
    } 
} 
break; 
+0

myArrai1 [0] = double.TryParse(Console.ReadLine());嘗試解析沒有提供重載方法? – 2012-03-07 20:37:04

+0

@Garrith您可以google double.TryParse查看該方法的簽名和使用示例。 – Servy 2012-03-07 20:40:03

+0

閱讀MSDN文檔。你需要傳遞一個double作爲out參數。 driis的答案几乎是正確的。 – 2012-03-07 20:40:05

3

您並不需要Regex

您可以簡單地使用decimal.Parsedouble.Parse - 如果輸入的字符串格式錯誤,您將得到FormatException

您發佈的代碼看起來是正確的 - 什麼不工作?

+0

decimal.TryParse是驗證是否可以解析而無需使用例外的替代方案。 – Servy 2012-03-07 20:35:18

+0

@Servy - 的確如此,但是我不清楚是否需要例外。 – Oded 2012-03-07 20:36:06

+0

TryParse更好。請參閱:http://stackoverflow.com/questions/467613/parse-v-tryparse – 2012-03-07 20:37:30

2

試試這個:

/^\d+(\.\d{1,2})?$/; 

    Regex regex = new Regex ("^\d+(\.\d{1,2})?$"); 
    MatchCollection matches = regex.Matches(text); 
    if (matches.Count>0)...... 
+0

對於正則表達式來說,也可能OP不應該用一個開始。 – 2012-03-07 20:49:06

7

正則表達式是用於驗證double有點沉重。改爲使用double.TryParse(如果輸入無效,將返回false)。

double dbl; 
if (!double.TryParse(Console.ReadLine(), out dbl)) 
    Console.WriteLine("Invalid input"); 
+0

Badcock這引發了一個異常我弄糊塗了,我需要處理這個錯誤,很快用戶命中返回一個錯誤顯示在控制檯上,說他們輸入了錯誤的字符只允許數字。對不起,我很累,它是一個沉重的日子。 – 2012-03-07 20:55:49

+0

是的,這種方法由於某種原因不起作用?如果我將它封裝在第一個插入文件中,我會馬上得到一個無效的輸入,如果它放在最下面並敲擊一個字母並返回,我仍然會得到一個異常? – 2012-03-07 21:09:39

+1

猜測:有可能'CultureInfo'也很有價值,可能只是調試它,看看傳入的值會有所幫助。最後,你的問題已經得到解答。 – 2012-03-07 21:12:34

2

你可能會更好使用.NET的雙重解析,而不是嘗試在Regex中重新發明它。您可以使用Double.TryParse測試字符串,並在可以解析數字的情況下執行轉換:

Console.WriteLine("Insert a number"); 
string input = Console.ReadLine(); 
double value; 
if (!Double.TryParse(input, NumberStyles.Any, CultureInfo.InvariantCulture, out value)) 
    throw new InvalidOperationException(String.Format("{0} could not be parsed as a valid number.", input)); 
+0

這就是爲什麼我不得不爲每次插入都做這件事? – 2012-03-07 20:40:41

+2

如果你打算拋出異常,那麼爲什麼還要用TryParse呢? – 2012-03-07 20:45:15

+1

@Garrith這就是什麼方法,所以你不需要一遍又一遍地重複相同的代碼。創建一個'GetDoubleFromUser()'方法,該方法返回一個double幷包含或多或少的代碼(但是返回)。 – Servy 2012-03-07 20:45:47