2012-03-07 5 views
0

Как добавить регулярное выражение, которое будет принимать десятичные разряды (5.23), но ничего другого в таком перерыве? т.е. обрабатывать только цифры и знаков после запятой, которые будут выдавать ошибку, если что-нибудь другое, чем это напечатано или возвращается:Regex C# console app

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; 

веселит ребят.

П. не уверены в том, как запрограммировать его с перерывом, также должен быть без исключения.

ответ

1

вы хотите просто проверить, какие входы пользователей или остановить их от сдачи в недопустимых символов в первую очередь ли?

В первом случае регулярное выражение действительно не требуется. Вы на правильном пути с double.Parse, но то, что вы хотите сделать, это double.TryParse. Сначала прочитайте ввод пользователя в строку, а затем 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. Вам нужно передать double как параметр out. driis 'ответ почти правильный. –

3

Для этого вам не нужен Regex.

Вы можете просто использовать decimal.Parse или double.Parse - если введенная строка находится в неправильном формате, вы получите FormatException.

Код, который вы опубликовали, выглядит правильно - что не работает?

+0

decimal.TryParse является альтернативой для проверки того, что он может быть разобран без необходимости использования исключений. – Servy

+0

@ Серви - Правда, но мне непонятно, вопрос о том, нужны ли исключения или нет. – 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

Regex немного тяжелы для проверки достоверности double. Вместо этого используйте double.TryParse (он вернет false, если вход недействителен).

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

Badcock это порождает исключение. Я запутался в раннем возрасте. Мне нужно обработать эту ошибку. Вскоре пользователь обращается к возврату. В консоли отображается сообщение об ошибке, указав, что они допустили неправильные номера символов. Извините, я очень устал, и это был тяжелый день. –

+0

Да, этот метод не работает по какой-то причине? Если я инкапсулирую его только в первую вставку, я сразу же получаю недопустимый ввод, если он поместил его внизу и ударил букву и вернулся, но я все еще получаю исключение? –

+1

Угадайте: потенциально «CultureInfo» будет полезен для прохождения, а может быть, просто отладить его и увидеть, какое значение передается в помощь. В итоге на ваш вопрос был дан ответ. –

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

thats abit hefty wouldnt я должен сделать это для каждой вставки? –

+2

Если вы собираетесь выбросить исключение в любом случае, тогда зачем беспокоиться о «TryParse»? –

+1

@Garrith Вот для чего нужны методы, так что вам не нужно повторять один и тот же код снова и снова. Создайте метод 'GetDoubleFromUser()', который возвращает double и содержит код более или менее подобным образом (но с возвратом). – Servy

Смежные вопросы