2012-03-07 11 views
0

小数点以下(5.23)を受け入れる正規表現を追加するにはどうすればよいのですか?すなわち、数字以外の小数点以下の桁のみを処理します。Regex 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はどのようにブレークでそれをプログラムするかについても、例外なく例外でなければなりません。

答えて

1

はあなただけのものを、ユーザー入力を検証する、または最初の場所で無効な文字を入れてからそれらを停止しましたか?

最初のケースでは、正規表現は実際には必要ありません。あなたはダブルで正しい軌道に乗っています。パースですが、あなたがしたいことはダブルです。まずユーザー入力を文字列に読み込み、TryParseをダブルクリックします。 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()); tryパースのためのオーバーロードメソッドはありませんか? –

+0

@Garrith Googleのdouble.TryParseを使用すると、メソッドのシグネチャとその使用例が表示されます。 – Servy

+0

MSDNのドキュメントをお読みください。 outパラメータとしてdoubleを渡す必要があります。ドリームスの答えはほぼ正しいです。 –

3

これにはRegexは必要ありません。

decimal.Parseまたはdouble.Parseを入力してください。入力文字列が間違った形式の場合は、FormatExceptionが表示されます。

あなたが掲示したコードは正しいと思われます - 何がうまくいかないのですか?

+0

decimal.TryParseが、それは例外を使用しなくても解析できることを確認するための代替手段です。 – Servy

+0

@Servy - 真実ですが、例外が欲しいのかどうかという疑問から私には分かりません。 – Oded

+0

TryParseが優れています。参照してください:http://stackoverflow.com/questions/467613/parse-v-tryparse –

2

これを試してみてください。

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

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

正規表現の場合は+1、またOPはおそらく使い始めるべきではありません。 –

7

は、正規表現はdoubleを検証するための少し重いです。代わりにdouble.TryParseを使用してください(入力が無効な場合はfalseを返します)。

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

Badcockこれは例外をスローします私は早く困惑しました。エラーを処理する必要があります。間違った文字を入力したというエラーメッセージがコンソールに表示されます。申し訳ありませんが、私はかなり疲れて、その重い一日でした。 –

+0

この方法は何らかの理由で機能しませんか?私はそれを最初の挿入にちょうどカプセル化すれば、それはそれが底に置いて文字を打つと私はまだ例外を取得する場合は、無効な入力をすぐに取得? –

+1

推測:潜在的に 'CultureInfo'も渡す価値があり、多分それをデバッグして渡されている値を見れば助けになるでしょう。結局あなたの質問は答えられました。 –

2

Regexで再作成するのではなく、.NETのダブルパージングを使用する方がよいでしょう。数を解析することができる場合は、文字列をテストし、変換を行うために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

それは私が各挿入のためにこれをしなければならないと思っていますか? –

+2

とにかく例外をスローするつもりなら、なぜ 'TryParse'に気をつけますか? –

+1

@ Garrithそれは何のためのメソッドなので、同じコードを何度も何度も繰り返す必要はありません。 doubleを返す 'GetDoubleFromUser()'メソッドを作ります。これは多かれ少なかれこのようなコードを含んでいます(しかしリターンを伴います)。 – Servy

関連する問題