2010-12-09 6 views
2

Я тратил часы на эту проблему, глядя повсюду ... Моя проблема проста: мы хотим проверить, что пользователь вошел в хорошее число. может быть целым числом или десятичным числом с комами, а не точками, и бесконечными числами после комы.C# Regex для французского десятичного

Я попробовал этот

Regex decimalRegex = new Regex(@"\d+(,\d+)?"); 

Я думал, что это было бы хорошо, но это, например: 2,324e верно, если я пытаюсь IsMatch на нем. Кроме того, это не имеет значения между точками и комами, поэтому это 2.23 в порядке с IsMatch с моим регулярным выражением.

Но я хочу, чтобы это было разрешено, например, с числом 2:

2 
2,2 
2,3243241428483248 
31324,232332 (infinite numbers before and after) 

и запретить:

2.2 
2,2434214e (any letter) 

и идеально упаси (я думал, что будет делать трюк, но это нет) ...

2,2,2 or 
2.2.2 

и позволяют только один кома ... Я в Fren ch culture иначе

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

+0

Подождите ... как ваш RE соответствует 2.23? Вы говорите, что он находит 2.23. Вы уверены, что это соответствует 2.23? – Keng 2010-12-09 16:21:21

+0

Я, точка в порядке Я не знаю, почему, это не должно, но оно проходит ... Я не понимаю, почему регулярное выражение не может видеть никакой разницы между и. – KitAndKat 2010-12-09 16:44:26

ответ

1

Вы в значительной степени находитесь на правильном пути; регулярное выражение, которое вам нужно, это @"^(\d+(,\d*)?|,\d+)$". ^ и $ заставляют регулярное выражение соответствовать началу и концу строки, поэтому ничего лишнего не допускается. Без них ваше регулярное выражение будет соответствовать 1,2 в 1,2e, и думаю, что было в порядке - это также почему 2,2,2 работал, так как он соответствовал первому 2,2 и проигнорировал остальные. И вот почему 2.2.2 соответствовало регулярному выражению 2 и проигнорировал остальное. В основном, анкеры очень полезны :-) Другая вещь, которую я изменил, заключалась в добавлении предложения ,\d+, которое позволяет сопоставлять номера формы ,123. Если вы этого не хотите, вытащите его (@"^\d+(,\d*)?$"). Аналогичным образом, если вы не хотите соответствовать 123,, тогда измените * на + (@"^\d+(,\d+)?$").

Если вы открыты для других решений, вы можете взять Ian's advice и использовать существующую функцию; Я также предлагаю заменить , на [.,], чтобы люди могли ввести 1,2 или 1.2, так как это на самом деле ничего не наносит вреда, но облегчает жизнь для некоторых. (Если вы действительно не беспокоитесь о тысячах разделителей, или у вас есть глубокая причина не хотеть второй.)

9

Вам нужно закрепить выражение:

Regex decimalRegex = new Regex(@"^\d+(,\d+)?$"); 

Без ^ в начале и $ в конце концов, выражение разрешено соответствуют любой подстроке строки, которую вы тестируете. Анкеры вместе запрещают подстроки от совпадения.

Другими словами, ваше исходное выражение будет соответствовать любой строке, содержащей хотя бы одну цифру.

+0

спасибо, что это именно то, что мне было нужно, не думал о якорях – KitAndKat 2010-12-09 17:13:29

5

Почему бы не использовать Int32.TryParse() или Double.TryParse() после настройки правильной культуры? В вашем вопросе вы сказали Int или Double, но затем сказали «бесконечные числа после запятой». В зависимости от их диапазонов они могут не быть Интс или парным разрядом, TryParse также проведет проверку диапазона ...

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